我有以下一段代码,点击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,那么保存这些图像的相应链接的数组不一定按照相同的顺序。确保在此异步活动期间不破坏顺序的最佳方法是什么?
使用Promise.all
将promise数组转换为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
});
}
的承诺。当给定可迭代对象中的所有承诺都已解决时,所有这些都会解决,如果有任何承诺拒绝,则会拒绝。
如果传入的任何一个Promise被拒绝,所有的Promise立即以被拒绝的Promise的值拒绝,并丢弃所有其他的Promise,无论它们是否已经解决。如果传递的是空数组,则此方法立即解析。