Angular 如何调用为循环中的每个项数组返回承诺的函数 public takePicture(){ let options:CaptureImageOptions={limit:3}; 返回此.mediaCapture.captureImage(选项) 。然后((数据:MediaFile[])=>{ 控制台日志(数据); for(设i=0;i{ 这个。保存(保存); }); } }) .catch((err:CaptureError)=>{console.log(err)}); }

Angular 如何调用为循环中的每个项数组返回承诺的函数 public takePicture(){ let options:CaptureImageOptions={limit:3}; 返回此.mediaCapture.captureImage(选项) 。然后((数据:MediaFile[])=>{ 控制台日志(数据); for(设i=0;i{ 这个。保存(保存); }); } }) .catch((err:CaptureError)=>{console.log(err)}); },angular,for-loop,promise,ionic3,angular5,Angular,For Loop,Promise,Ionic3,Angular5,我正在尝试从相机拍摄到手机的每个图像,以调用beforeSave()。然而,只有第一次,承诺才得到回报。我应该如何实现我的代码,以便对数据数组中的每个项目执行该操作?您将立即返回,而for循环没有完成。尝试删除返回按钮 public takePicture() { let options: CaptureImageOptions = { limit: 3 }; return this.mediaCapture.captureImage(options) .then((da

我正在尝试从相机拍摄到手机的每个图像,以调用beforeSave()。然而,只有第一次,承诺才得到回报。我应该如何实现我的代码,以便对数据数组中的每个项目执行该操作?

您将立即返回,而for循环没有完成。尝试删除
返回按钮

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) });
}
public takePicture(){
let options:CaptureImageOptions={limit:3};
返回此.mediaCapture.captureImage(选项)
。然后((数据:MediaFile[])=>{
控制台日志(数据);
for(设i=0;i{/!!删除此处的返回
这个。保存(保存);
});
}
})
.catch((err:CaptureError)=>{console.log(err)});
}

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

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) });
}

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

你认为
承诺吗。所有的
都能帮助你吗@你能举个例子吗?哦,你马上回来,好吧,让我试试。尝试删除答案中的
return
关键字。此外,它应该是
I答案。此方法的一个问题是它不会处理
this.beforeSave()中的错误
promise-chain或在
this.save()
中。它会忽略这些错误,甚至可能以
未经处理的退出
结束。此外,它不会将错误传播回调用者,也不会让调用者知道一切都完成了。我想你关于使用
Promise.all()
的第一条评论可能就是这个需要的。@jfriend00你能推荐一个更好的解决方案吗?@AliF50这需要时间来调用save()为什么?
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;
    });
}