【问题标题】:How can I call a function that returns a promise for each item array in a loop如何调用一个函数,该函数为循环中的每个项目数组返回一个承诺
【发布时间】:2020-03-16 23:56:34
【问题描述】:
public takePicture() { 
 let options: CaptureImageOptions = { limit: 3 };
    return this.mediaCapture.captureImage(options)
      .then((data: MediaFile[]) => {
        console.log(data);
        for (let i = 0; i <= data.length; i++) {
          return this.beforeSave(data[i].fullPath).then((save) => {
            this.save(save);
          });
        }
      })
      .catch((err: CaptureError) => { console.log(err) });
}

我正在尝试为从相机拍摄到手机的每张图像调用 beforeSave()。但是,只有第一个,才会返回承诺。我应该如何实现我的代码才能为我的数据数组中的每个项目执行它?

【问题讨论】:

标签: angular for-loop promise ionic3 angular5


【解决方案1】:

如果这里的目标是保存所有捕获的图像并将完成或错误反馈给调用者,那么您可以更改为.map() 以收集一组承诺并使用Promise.all() 来监控该承诺数组.该代码如下所示:

public takePicture() { 
    let options: CaptureImageOptions = { limit: 3 };
    return this.mediaCapture.captureImage(options).then((data: MediaFile[]) => {
        console.log(data);
        // collect array of promises and use Promise.all() to monitor them
        return Promise.all(data.map(item => {
            return this.beforeSave(item.fullPath).then((save) => {
              return this.save(save);
            });
        }));
    }).catch((err: CaptureError) => { 
        // log error, then rethrow so caller can see the error
        console.log(err) 
        throw err;
    });
}

仅供参考,这假设您使用 this.beforeSave()this.save() 是正确的。我不知道这些接口,所以我只是在这方面带头。

【讨论】:

    【解决方案2】:

    您马上返回,for 循环没有完成。尝试删除return

    public takePicture() { 
     let options: CaptureImageOptions = { limit: 3 };
        return this.mediaCapture.captureImage(options)
          .then((data: MediaFile[]) => {
            console.log(data);
            for (let i = 0; i < data.length; i++) {
              this.beforeSave(data[i].fullPath).then((save) => { // !! Remove the return here
                this.save(save);
              });
            }
          })
          .catch((err: CaptureError) => { console.log(err) });
    }
    

    【讨论】:

    • 还有,应该是i &lt; data.length
    • 可以通过解释您更改的内容以及原因来改进零解释的答案,而无需让我们自己进行视觉差异。
    • 这种方法的一个问题是它不能处理this.beforeSave() 承诺链或this.save() 中的错误。它会忽略这些错误,甚至可能以unhandledRejection 结尾。此外,它不会将错误传播回调用者或​​让调用者知道一切何时完成。我认为您对使用Promise.all() 的第一条评论可能就是这需要的。
    • @jfriend00 你能提出更好的解决方案吗?
    • @AliF50 这需要时间来调用 save() 为什么?
    猜你喜欢
    • 2017-05-16
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2014-08-31
    相关资源
    最近更新 更多