[英]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>;
FileEntry
是Entry
的子類,因此是強制返回。 但是,該錯誤與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.