nodejs循环中的异步函数

时间:2015-08-22 18:23:48

标签: node.js loops

我在while循环中调用异步函数时遇到问题。

问题是'while'语句将在其基础函数结果出现之前结束,那是因为它是异步函数。 代码如下:

while (end < min) {
  db.collection('products').count({
      tags: {
        $in: ['tech']
      }
    }, function(err, result) {
      if (result) {
        a = result;
      }
    });
  max = min;
  min = max - step;
  myitems.push(a);
}
res.send(myitems);

并且最后我无法发送结果,因为所有迭代都应该在发送最终结果之前完成。 我怎么能修改代码来解决这个问题?

提前致谢

2 个答案:

答案 0 :(得分:1)

不使用第三方库,这是一种手动排序异步操作的方法。请注意,因为这是异步的,所以当您看到迭代完成后,您必须在next()函数内部处理结果。

// assume that end, max, min and step are all defined and initialized before this
var results = [];
function next() {
    if (end < min) {
        // something seems missing from the code here because
        // this db.collection() call is always the same
        db.collection('products').count({tags: {$in: ['tech']}}, function(err, result)  {
            if (!err && result) {
                results.push(result);
                max = min;
                min - max - step;
                next();
            } else {
                // got an error or a missing result here, provide error response
                console.log("db.collection() error or missing result");
            }
        }
    } else {
        // all operations are done now
        // process the results array
        res.send(results);
    }
}

// launch the first iteration
next();

答案 1 :(得分:0)

您可以利用第三方库来执行此操作(使用async的非工作performQuery示例):

function performQuery(range, callback) {
  // the caller could pre calculate 
  // the range of products to retrieve
  db.collection('products').count({
      tags: {
        $in: ['tech'],
        // could have some sort of range query
        $gte: range.min,
        $lt: range.max
      }
    }, function(err, result) {
      if (result) {
        callback(result)
      }
    });
}

async.parallel([
    performQuery.bind(null, {min: 0, max: 10}),
    performQuery.bind(null, {min: 10, max: 20})
], function(err, results) {
   res.send(results);
});