繁体   English   中英

Promise.reject出现TypeScript错误

[英]TypeScript error with Promise.reject

为什么我用编写的此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(...) ,正确的实现是什么?

要返回承诺,您可以创建一个承诺的新实例并返回该实例。 构造函数采用一个函数,该函数接收逻辑成功或失败时应调用的resolve和拒绝回调。

为了让您的承诺“返回”结果,您不编写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
      }
    });
  });
}

如果您想了解有关承诺的更多信息,请阅读以下示例: 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,您可以在其上进行链接。 (我认为这是正确的方法。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM