node.js - 带有嵌套 promise 的循环

标签 node.js for-loop promise

从 For 循环内的 Promise 获取结果的最佳方法是什么。 在此示例中,当循环结束时,代码 resultArray 尚未完成。

  var resultArr = [];
  var itemArray1 = [1, 2, 3, 4, 5];
  var itemArray2 = ['a','b','c','d','e'];
  for (var a = 0; a < itemArray1.length; a++) {
      for (var b = 0; b < itemArray2.length; b++) {
          myPromise(a,b)
          .then(function(result) {
                if (result != null) {
                    resultArr.push(result);
                }
          });

      }
  }  

  // resultArray is still not complete


 function myPromise(a,b) {
     return new Promise(function(resolve, reject) {
         // request to mongodb
         myTable.findOne({ _id:a, name:b }, function(err,result) {
             if (err) throw err;
             resolve(result);
         });
     });
 } 

最佳答案

在我看来,执行此类操作的最简洁方法是将 Promise.all()Array#map 结合使用。另外,请确保您的函数保持干净简洁,并给它们指定有意义的名称!

var itemArray1 = [1, 2, 3, 4, 5];
var itemArray2 = ['a','b','c','d','e'];

function flatten(arrays) {
    return [].concat(arrays);
}

function queryAs() {
    return Promise.all(itemArray1.map(queryBs))
        // the result is an array of arrays, so we'll flatten them here
        .then(flatten);
}

function queryBs(a) {
    return Promise.all(itemArray2.map(function (b) {
        return performQuery(a, b);
    }));
}

// resultArray is still not complete
function performQuery(a, b) {
    return new Promise(function(resolve, reject) {
        // request to mongodb
        myTable.findOne({ _id:a, name:b }, function(err,result) {
            if (err) throw err;
            resolve(result);
        });
    });
}

queryAs().then(function (results) {
    console.log(results);
});

关于node.js - 带有嵌套 promise 的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36735316/

相关文章:

c++ - 从 C++ Node.js 插件渲染文件

c++ - forloop 数组行

javascript - 从 Node.js 中的 Promise(Bluebird) 返回值

javascript - 带有异步例程的新对象

javascript - Promises.all 的快速失败行为

javascript - 如何读取 Node 中发出的简单http请求的响应

javascript - 限制用户可以输入的 JavaScript

javascript - 使用动态键推送到 mongodb 数组

JavaScript 数组 ab=ba

linux - Shell,For循环进入目录和子目录未按预期工作