为什么我使用我编写的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(...)
以及正确的实施方式?
答案 0 :(得分:2)
要返回承诺,请创建新的承诺实例并返回此实例。当逻辑成功或失败时,构造函数接受一个函数,该函数接收您应该调用的解析和拒绝回调。
让你的承诺&#34;返回&#34;结果,您不能写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
答案 1 :(得分:1)
您不应该在承诺链中真正返回已解决或被拒绝的承诺。
如果要指出错误,则应该抛出错误:
else
let err = new FileError(13);
err.message = 'input is not a file';
throw err;
答案 2 :(得分:0)
您可以尝试用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,并且可以在其上进行链接。 (我认为这是正确的方法。)