异步活动后的数组顺序

时间:2016-11-04 09:49:30

标签: javascript node.js asynchronous mean-stack

我有以下代码,它可以访问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,则保存这些图像的相应链接的数组不一定是相同的顺序。在此异步活动期间,确保订单不受损害的最佳方法是什么?

2 个答案:

答案 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拒绝则拒绝。

如果任何传入的承诺拒绝,所有承诺立即拒绝拒绝的承诺的价值,放弃所有其他承诺,无论他们是否已经解决。如果传递了一个空数组,则此方法立即解析。