我有以下代码,它可以访问API以上传图像数组并将其链接返回到数组中;但是,上传图像的顺序并不受尊重。
if (req.files) {
var uploadedImages = [];
for (var i = 0; i < req.files.length; i++) {
imgur.uploadFile(req.files[i].path)
.then(function (json) {
uploadedImages.push(json.data.link);
if (uploadedImages.length === req.files.length) {
console.log(uploadedImages);
//Further processing
}
})
.catch(function (err) {
console.log("Imgur API Error!");
console.log(err.message);
res.redirect('/participants?err=' + encodeURIComponent('An unknown error occured. Please try again.'));
});
}
因此,例如,如果我上传1.jpg,2.jpg和3.jpg,则保存这些图像的相应链接的数组不一定是相同的顺序。在此异步活动期间,确保订单不受损害的最佳方法是什么?
答案 0 :(得分:2)
使用Promise.all
将promises数组转换为数组的promise:
var uploads = req.files.map(function (file) {
return imgur.uploadFile(file.path)
.then(function (json) {
return json.data.link;
});
});
Promise.all(uploads)
.then(function (uploadedImages) {
console.log(uploadedImages);
// Further processing
})
.catch(function (err) {
console.log("Imgur API Error!");
console.log(err.message);
res.redirect('/participants?err=' + encodeURIComponent('An unknown error occured. Please try again.'));
});
答案 1 :(得分:0)
function uploader(file) {
new Promise((resolve, reject) => {
//do upload here and resolve path
resolve('PATH AFTER UPLOAD')
});
}
if(req.files) {
tasks = [];
for (var i = 0; i < req.files.length; i++) {
tasks.push(uploader(req.files[i].path))
}
Promise.all(tasks)
.then(uploadedImagesPath => {
console.log(uploadedImagesPath );
})
.catch( (err) => {
console.log(err)//any error
});
}
Promise.all在给定迭代中的所有promise都已解决时解析,或者如果任何promises拒绝则拒绝。
如果任何传入的承诺拒绝,所有承诺立即拒绝拒绝的承诺的价值,放弃所有其他承诺,无论他们是否已经解决。如果传递了一个空数组,则此方法立即解析。