javascript - for循环中的 promise 问题

标签 javascript for-loop asynchronous callback promise

我遇到了一个让我有点发疯的情况。

所以情况如下:

module.exports = {
  
  generation: function (req, res) {

    // Let's firstly fetch all the products from the productTmp Table
    function fetchProductsTmp (){
      ProductsTmp.find().then(function (products) {
        return Promise.all(products.map (function (row){
           Service.importProcess(row);
        }));
      });
    }
    fetchProductsTmp();
  }

在这里,我只是调用我的模型 ProductsTmp 来获取我的数据并通过调用 importProcess 遍历我的行。

导入过程:

importProcess: function (product) {

    async.series([
      function (callback) {
        return SousFamille.findOne({name: product.sous_famille}).then(function (sf) {
          console.log('1');
          if (!sf) {
            return SousFamille.create({name: product.sous_famille}).then(function (_sf)             {
              console.log('2');
              callback(null, _sf.sf_id);
            });
          } else {
              callback(null, sf.sf_id);
          }
        });
      },
      function (callback){
        console.log('3');
      },
    ], function(err, results){
      if(err) return res.send({message: "Error"});

    });
      
}

所以我得到了我的控制台日志: 1个 1个 1个 2个 3个 2个 3个 2个 3

我想要获得的是 1 2 3 1 2 3 1 2 3 这样每个函数在调用下一个之前等待 promise 完成。

最佳答案

在第一节的generation函数中,替换

return Promise.all(products.map (function (row){
    Service.importProcess(row);
}));

var results = [],
    pushResult = id => results.push(id);
return products.reduce(function(prev, row){//Go through all the products
    //Take the previous promise, and schedule next call to Service.importProcess to be
    //made after the previous promise has been resolved
    return prev.then(function(){
        return Service.importProcess(row).then(pushResult);
    });
}, Promise.resolve())
.then(() => results);

您还需要从 importProcess 返回一个 promise 才能工作。只需抛弃整个 async.series 东西,然后做一些类似的事情

return new Promise(function(resolve, reject){
     ...
     resolve(sf.sf_id); //instead of the callback(null, sf.sf_id)
     ...
});

更新:这强制对 Service.importProcess 的调用是顺序的而不是并发的,这确实会影响对 generation 的调用的整体性能。但我猜你有比顺序 console.logs 更充分的理由这样做。

关于javascript - for循环中的 promise 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36688626/

相关文章:

windows - FOR 循环将每次迭代用相同的前缀分组在一行中

javascript - 在 get 请求的 do while 循环中使用闭包

javascript - 从嵌套异步函数调用返回谓词

ios - 如何使用 Alamofire 和 Rxswift 等待异步 api 响应?

asynchronous - 在 Flutter 中创建异步验证器

javascript - 保持窗口隐藏直到初始化完成

javascript - 使用 jquery 创建评论框并在 Coldfusion 中工作

javascript - for/循环中的计数器变量。为什么一个程序可以运行而另一个程序却失败?

javascript - NoUiSlider 无法正常工作

javascript - Polymer1.0 验证两个输入[type=date]