我如何调用一个 returns 循环中每个项目数组的承诺的函数
How can I call a function that returns a promise for each item array in a loop
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) });
}
我正在尝试为我从相机拍摄的每张图像 phone 调用 beforeSave()。然而,只有第一个,承诺被返回。我应该如何实现我的代码才能为我的数据数组中的每一项执行此操作?
您马上返回,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) });
}
如果这里的目标是保存所有捕获的图像并将完成或错误反馈给调用者,那么您可以更改为 .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()
的使用是正确的。我不知道这些接口,所以我只是在这方面带头。
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) });
}
我正在尝试为我从相机拍摄的每张图像 phone 调用 beforeSave()。然而,只有第一个,承诺被返回。我应该如何实现我的代码才能为我的数据数组中的每一项执行此操作?
您马上返回,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) });
}
如果这里的目标是保存所有捕获的图像并将完成或错误反馈给调用者,那么您可以更改为 .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()
的使用是正确的。我不知道这些接口,所以我只是在这方面带头。