诺言数组两种不同的行为

时间:2018-11-18 17:22:47

标签: javascript angular typescript

我有一个代码,可以产生承诺数组:

    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返回,但是无论如何它在运行时都无法正常工作。

2 个答案:

答案 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);