Promise.reject的TypeScript错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise.reject的TypeScript错误相关的知识,希望对你有一定的参考价值。

为什么我用这个我编写的TypeScript方法收到以下编译错误:

getFile(path: string): Promise<FileEntry> {
  return this.file.resolveLocalFilesystemUrl(path)
    .then(entry => {
      if (entry.isFile) {
        return <FileEntry>entry;
      } else {
        let err = new FileError(13);         
        err.message = 'input is not a file';
        return Promise.reject(err);
      }
    });
}

我收到错误:

Argument of type '(entry: Entry) => Promise<never> | FileEntry' is not assignable to parameter of type '(value: Entry) => PromiseLike<never>'. Type 'Promise<never> | FileEntry' is not assignable to type 'PromiseLike<never>'. Type 'FileEntry' is not assignable to type 'PromiseLike<never>'. Property 'then' is  missing in type 'FileEntry'.

resolveLocalFilesystemUrl的定义如下:

resolveLocalFilesystemUrl(fileUrl: string): Promise<Entry>;

FileEntryEntry的子类,因此是铸造的返回。但是,错误是围绕Promise.reject

如果我将拒绝行更改为以下内容,则可以:

return Promise.reject<FileEntry>(err);

我是否需要返回Promise.reject(...)以及正确的实现方式?

答案

要返回承诺,请创建新的承诺实例并返回此实例。当逻辑成功或失败时,构造函数接受一个函数,该函数接收您应该调用的解析和拒绝回调。

为了让你的承诺“回报”你的结果,你不要写return result,而是打电话给resolve(result)

getFile(path: string): Promise<FileEntry> {
  return new Promise<FileEntry>((resolve, reject) => {
    // Your logic here.
    // call resolve() on success
    // or reject() on failure
  });
}

所以在你的情况下它应该如下所示:

getFile(path: string): Promise<FileEntry> {
  return new Promise<FileEntry>((resolve, reject) => {
    this.file.resolveLocalFilesystemUrl(path)
    .then(entry => {
      if (entry.isFile) {
        resolve(<FileEntry>entry); // Success
      } else {
        let err = new FileError(13);         
        err.message = 'input is not a file';
        reject(err); // Error
      }
    });
  });
}

如果你想了解更多关于promises的信息,请阅读:https://developers.google.com/web/fundamentals/primers/promises

另一答案

您不应该在您的承诺链中真正返回已解决或被拒绝的承诺。

如果要指出错误,则应该抛出错误:

else
   let err = new FileError(13);         
   err.message = 'input is not a file';
   throw err;
另一答案

您可以尝试使用Promise.resolve包装return entry。当我遇到类似错误时,这解决了。

getFile(path: string): Promise<FileEntry> {
  return this.file.resolveLocalFilesystemUrl(path)
    .then(entry => {
      if (entry.isFile) {
        // See this
        return Promise.resolve(<FileEntry>entry);
      } else {
        let err = new FileError(13);         
        err.message = 'input is not a file';
        return Promise.reject(err);
      }
    });
}

您不必编写详细的new Promise((resolve, reject) => {}),因为您的底层this.file.resolveLocalFilesystemUrl已经返回Promise并且您可以链接它。 (我觉得这是正确的方法。)

以上是关于Promise.reject的TypeScript错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Promise.all() 之后不调用 onRejected,其中包含在数组中的 Promise.reject() 传递给 Promise.all()?

`Promise.reject` 的可观察等效项是啥

为啥return Promise.reject会打印断点

Promise静态方法实现(all race finally resolve reject)

对Promise的研究4

javascript Promise.resolve和Promise.reject示例