簡體   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