异步活动后数组的顺序



我有以下一段代码,点击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,无论它们是否已经解决。如果传递的是空数组,则此方法立即解析。

相关内容

  • 没有找到相关文章

最新更新