asynchronous活动后数组的顺序

我有以下一段代码,命中一个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,那么保存这些图像的链接的数组不一定是相同的顺序。 确保订单在此asynchronous活动期间不受影响的最佳方法是什么?

使用Promise.allPromise.all数组转换为数组的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.')); }); 
 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 }); } 

所有的承诺都解决了,或者拒绝了任何承诺的拒绝。

如果承诺中的任何一个拒绝,那么所有的承诺立即拒绝承诺的价值拒绝,抛弃所有其他的承诺,不pipe他们是否已经解决。 如果传递一个空数组,那么这个方法立即解决。