首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拒绝错误承诺时的TypeScript错误TS2345

拒绝错误承诺时的TypeScript错误TS2345
EN

Stack Overflow用户
提问于 2017-01-12 16:17:30
回答 3查看 1.6K关注 0票数 2

我有一个TypeScript错误消息,它的错误我不明白。错误信息是:

error TS2345:类型为‘(错误:错误)的参数’(错误:错误),=> void \答应‘不能分配给类型的参数’(原因: any) =>,IdentityKeyPair,of,PromiseLike‘。键入'void \答应‘不能指定键入'IdentityKeyPair \ PromiseLike’。

我的代码运行良好,但当我更改这个块时,TypeScript对我很生气:

代码语言:javascript
运行
复制
.catch((error) => {
  let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
  return this.store.save_identity(identity);
})

这方面:

代码语言:javascript
运行
复制
.catch((error) => {
  if (error instanceof RecordNotFoundError) {
    let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
    return this.store.save_identity(identity);
  } else {
    return reject(error);
  }
})

下面是正在工作的完整代码:

代码语言:javascript
运行
复制
public init(): Promise<Array<Proteus.keys.PreKey>> {
  return new Promise((resolve, reject) => {
    this.store.load_identity()
      .catch((error) => {
        let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
        return this.store.save_identity(identity);
      })
      .then((identity: Proteus.keys.IdentityKeyPair) => {
        this.identity = identity;
        return this.store.load_prekey(Proteus.keys.PreKey.MAX_PREKEY_ID);
      })
      .then((lastResortPreKey: Proteus.keys.PreKey) => {
        return resolve(lastResortPreKey);
      })
      .catch(reject);
  });
}

下面是不再编译的代码:

代码语言:javascript
运行
复制
public init(): Promise<Array<Proteus.keys.PreKey>> {
  return new Promise((resolve, reject) => {
    this.store.load_identity()
      .catch((error) => {
        if (error instanceof RecordNotFoundError) {
          let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
          return this.store.save_identity(identity);
        } else {
          return reject(error);
        }
      })
      .then((identity: Proteus.keys.IdentityKeyPair) => {
        this.identity = identity;
        return this.store.load_prekey(Proteus.keys.PreKey.MAX_PREKEY_ID);
      })
      .then((lastResortPreKey: Proteus.keys.PreKey) => {
        return resolve(lastResortPreKey);
      })
      .catch(reject);
  });
}

有人知道为什么TypeScript编译器拒绝使用错误代码TS2345return reject(error);语句吗?

截图:

我使用的是TypeScript 2.1.4。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-12 16:32:21

下面试一试。当您在一个时间或捕获块时,您可以返回一个承诺或一个值,这些承诺或值被包装成一个承诺。您是自己手动处理承诺的,因此您只需调用决心并拒绝处理程序,而不需要返回任何内容。返回reject(error)将尝试获取返回的值,将其包装在一个承诺中,然后尝试传递到下一个then块,这就是为什么要得到所做的错误。可以这样想:在处理程序中返回某些内容意味着继续使用这个新值。在您的情况下,我认为您只是想停止链接,并有承诺,您正在创造的决心或拒绝在特定的条件。

代码语言:javascript
运行
复制
public init(): Promise<Array<Proteus.keys.PreKey>> {
  return new Promise((resolve, reject) => {
    this.store.load_identity()
      .catch((error) => {
        if (error instanceof RecordNotFoundError) {
          let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
          return this.store.save_identity(identity);
        } else {
          throw error;
        }
      })
      .then((identity: Proteus.keys.IdentityKeyPair) => {
        this.identity = identity;
        return this.store.load_prekey(Proteus.keys.PreKey.MAX_PREKEY_ID);
      })
      .then((lastResortPreKey: Proteus.keys.PreKey) => {
        resolve(lastResortPreKey);
      })
      .catch((error) => {
        reject(error);
      });
  });
}
票数 3
EN

Stack Overflow用户

发布于 2017-01-12 22:03:16

您无法阻止承诺链(取消除外),甚至不能通过returnning reject()来阻止承诺链,这显然是对承诺的滥用(您不应该将承诺包装在另一个承诺构造器中)。

让我们从你能做的开始,然后去做你应该做的事情。

您可以让拒绝冒泡掉下承诺链,当它与类型保护不匹配时再对其进行throw处理,在行的底部,在所有的.catch()子句都耗尽了自己之后,函数返回的承诺将被拒绝。

现在

考虑一下如何在同步代码中这样做。你会有这样的东西:

代码语言:javascript
运行
复制
try {
  try {
    actionThatThrows();
  } catch (err) {
    breakEverything();
  }
  continue other steps
} catch(err) {
  generalErrorHandling();
}

这种代码是不好的,在承诺中也是不行的。您应该将不同的操作移动到可以自行解决或拒绝的函数中,使用错误的含义,这是一个异常,它会在堆栈上出现气泡,直到它遇到能够处理它的东西为止。

另外,由于您使用的是TS 2.1.x,对于长异步流,建议使用异步函数

票数 2
EN

Stack Overflow用户

发布于 2017-01-12 16:31:37

您的返回在那里是无用的,它是onRejection回调的结束。并且返回reject()将履行下一个.then()承诺。但是,如果您抛出错误,它将在下面的承诺中继承到.catch(拒绝);

基本上:在任何捕获/然后,返回将解决儿童的承诺,并抛出将拒绝儿童的承诺。

我重写了您的代码,以获得更好的承诺链流。

代码语言:javascript
运行
复制
public init(): Promise<Array<Proteus.keys.PreKey>> {
  return new Promise((resolve, reject) => {
    this.store.load_identity()
    .catch(
      (error) => {
        if (error instanceof RecordNotFoundError) {
          let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
          return this.store.save_identity(identity);
        } else {
          throw error;
        }
      }
    )
    .then(
      (identity: Proteus.keys.IdentityKeyPair) => {
        this.identity = identity;
        resolve(this.store.load_prekey(Proteus.keys.PreKey.MAX_PREKEY_ID));
      },
      reject
    )
  });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41618064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档