我有一个代码,可以产生承诺数组:
async addDefect(payload) {
this.newDefect.setNote(payload.note);
this.newDefect.setPriority(payload.priority);
const name = await this.storage.get(StorageKeys.NAME);
const movingFilesJob = this.cachedPhotoUrls.map(url => {
const defectImage = this.newDefect.generateImageUrl(name);
return this.file.moveImageToAppFile(url, defectImage.url);
});
await Promise.all(movingFilesJob);
this.viewCtrl.dismiss(this.newDefect);
}
现在,我想将movingFilesFob
的创建移至另一个类。我编写了以下函数:
async persistPhotos(photoBuffer: string[], defect: Defect) {
const name = await this.storage.get(StorageKeys.NAME);
return photoBuffer.map(url => {
const defectImage = defect.generateImageUrl(name);
return this.file.moveImageToAppFile(url, defectImage.url);
});
}
但是当我尝试替换代码时,出现以下错误:
“ Promise []>”类型的参数不可分配给“ Iterable <{}”类型的参数PromiseLike <{} >>'。属性“ [Symbol.iterator]”缺少“ Promise []>”
我将按如下所示调用新函数:
async addDefect(payload) {
this.newDefect.setNote(payload.note);
this.newDefect.setPriority(payload.priority);
const name = await this.storage.get(StorageKeys.NAME);
const movingFilesJob = this.photo.persistPhotos(this.cachedPhotoUrls, this.newDefect);
await Promise.all(movingFilesJob);
this.viewCtrl.dismiss(this.newDefect);
}
第一个示例中的相同代码为何起作用,但在以下示例中却不起作用。我可以键入:any返回,但是无论如何它在运行时都无法正常工作。
答案 0 :(得分:3)
在函数内移动Promise.all
async persistPhotos(photoBuffer: string[], defect: Defect) {
const name = await this.storage.get(StorageKeys.NAME);
return Promise.all(photoBuffer.map(url => {
const defectImage = defect.generateImageUrl(name);
return this.file.moveImageToAppFile(url, defectImage.url);
}));
}
Async
函数始终返回一个Promise。现在,您将返回一个Promises数组。因此,此函数的结果是一个Promise返回一个Promises数组:
const results = await persistPhotos(...);
现在results
将包含承诺数组。如果要获得他们的结果,则必须:
const realResults = await Promise.all(results);
或者,您可以在函数内移动Promise.all
。
答案 1 :(得分:3)
直接回答这个问题:
第一个示例中的相同代码如何起作用,而在以下示例中却不起作用。我可以键入:any返回,但是无论如何它在运行时都无法运行。
因为您无意中更改了返回类型。
原文:
const movingFilesJob = this.cachedPhotoUrls.map(...)
这会为movingFilesJob
分配一个数组。
重构:
return photoBuffer.map(...)
从persistPhotos()
返回Promise对象的数组,而async
关键字则将其作为Promise对象而不是它们的数组。
T.J。人群总是值得关注的人:正如他指出的那样,简单的解决方法是等待地图上的承诺:
const movingFilesJob = await this.photo.persistPhotos(this.cachedPhotoUrls, this.newDefect);