【问题标题】:Make response when foreach is finished在 foreach 完成时做出响应
【发布时间】:2013-12-10 20:29:23
【问题描述】:
data.forEach(function(shelf){  
  books.find({"shelfid":shelf.id},function(book){
   //book1,book2,book3
  })
});

每个书架都有一个 id,我会找到所有有这些 id 的书。 所以假设这个方法找到 3 本书,我如何回应所有这些 在 foreach 完成时同时预订。

【问题讨论】:

  • 我如何知道 for each 是否完成?
  • 如果你有几种异步方法,我建议使用async.js作为节点。
  • 你可以使用promises
  • 在 SO 上不是已经有一百万个这样的问题了吗? stackoverflow.com/questions/10551499/…
  • 如果这真的是 mongo/mongoose,你应该使用 $in 运算符 ...books.find({shelfid: { $in: [ shelfIds ] }}, function(...){})

标签: javascript node.js asynchronous foreach


【解决方案1】:

async module 非常适合:

它基本上遍历每一个,并允许您指定一个函数在它们全部运行后运行。

var arr = [];
async.each(data, function (fd, callback) {
    books.find({"shelfid":fd.id},function(book){
        arr.push(book);
        callback();
    });
}, function(err){
    // this runs once they've all been iterated through.
    // if any of the finds produced an error, err would equal that error
    // books are in the arr array now.
});

编辑

正如 WiredPrairie 指出的那样,这样做更有意义:

 books.find({shelfid: { $in: [shelfIds] }}, function(books){
     // do stuff with books.
 })

【讨论】:

  • 不使用模块就不行吗?
  • @hackio 更新了答案以包含一种无需模块即可完成的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2013-10-12
  • 2019-06-13
  • 2023-03-23
  • 2015-12-22
  • 2018-07-14
相关资源
最近更新 更多