Javascript Node/Express—如何等待循环结束后使用JSON响应

Javascript Node/Express—如何等待循环结束后使用JSON响应,javascript,node.js,Javascript,Node.js,我的express应用程序中有一个函数,可以在For循环中进行多个查询,我需要设计一个回调,在循环完成时用JSON响应。但是,我还不确定如何在Node中执行此操作。这是我到目前为止所拥有的,但它还没有发挥作用 exports.contacts_create = function(req, res) { var contacts = req.body; (function(res, contacts) { for (var property in contacts) { // fo

我的express应用程序中有一个函数,可以在For循环中进行多个查询,我需要设计一个回调,在循环完成时用JSON响应。但是,我还不确定如何在Node中执行此操作。这是我到目前为止所拥有的,但它还没有发挥作用

exports.contacts_create = function(req, res) {
  var contacts = req.body;
  (function(res, contacts) {
    for (var property in contacts) { // for each contact, save to db
       if( !isNaN(property) ) {      
           contact = contacts[property];
                var newContact  = new Contact(contact);
                newContact.user = req.user.id
                newContact.save(function(err) {
                   if (err) {  console.log(err) };
                }); // .save
       }; // if !isNAN
    }; // for
            self.response();
  })(); // function
}; // contacts_create

exports.response = function(req, res, success) {
    res.json('finished');
};

除了回调结构之外,代码还有一些问题

var contacts = req.body;
(function(res, contacts) {

   ...

})(); // function
^您正在参数列表中重新定义
联系人
res
,但没有传入任何参数,因此在函数中
res
联系人
将是
未定义的

另外,不确定您的
self
变量来自何处,但可能您在其他地方定义了它

至于回调结构,您正在寻找类似的内容(假设contacts是一个数组):

但是,您可能需要考虑并行执行数据库的保存。大概是这样的:

var savesPending = contacts.length;
var saveCallback = function (i, err) {
  if (err)
    console.log('Saving contact ' + i + ' failed.');

  if (--savesPending === 0)
    res.json('finished');
};

for (var i in contacts) {
  ...
  newContact.save(saveCallback.bind(null, i));
}
这样,您就不必等待每次保存完成后再开始下一次数据库往返


如果您不熟悉我为什么使用
saveCallback.bind(null,I)
,那么基本上是为了让回调能够知道在发生错误时哪个联系人失败。查看是否需要引用。

除了回调结构之外,代码还有一些问题

var contacts = req.body;
(function(res, contacts) {

   ...

})(); // function
^您正在参数列表中重新定义
联系人
res
,但没有传入任何参数,因此在函数中
res
联系人
将是
未定义的

另外,不确定您的
self
变量来自何处,但可能您在其他地方定义了它

至于回调结构,您正在寻找类似的内容(假设contacts是一个数组):

但是,您可能需要考虑并行执行数据库的保存。大概是这样的:

var savesPending = contacts.length;
var saveCallback = function (i, err) {
  if (err)
    console.log('Saving contact ' + i + ' failed.');

  if (--savesPending === 0)
    res.json('finished');
};

for (var i in contacts) {
  ...
  newContact.save(saveCallback.bind(null, i));
}
这样,您就不必等待每次保存完成后再开始下一次数据库往返


如果您不熟悉我为什么使用
saveCallback.bind(null,I)
,那么基本上是为了让回调能够知道在发生错误时哪个联系人失败。查看是否需要引用。

除了回调结构之外,代码还有一些问题

var contacts = req.body;
(function(res, contacts) {

   ...

})(); // function
^您正在参数列表中重新定义
联系人
res
,但没有传入任何参数,因此在函数中
res
联系人
将是
未定义的

另外,不确定您的
self
变量来自何处,但可能您在其他地方定义了它

至于回调结构,您正在寻找类似的内容(假设contacts是一个数组):

但是,您可能需要考虑并行执行数据库的保存。大概是这样的:

var savesPending = contacts.length;
var saveCallback = function (i, err) {
  if (err)
    console.log('Saving contact ' + i + ' failed.');

  if (--savesPending === 0)
    res.json('finished');
};

for (var i in contacts) {
  ...
  newContact.save(saveCallback.bind(null, i));
}
这样,您就不必等待每次保存完成后再开始下一次数据库往返


如果您不熟悉我为什么使用
saveCallback.bind(null,I)
,那么基本上是为了让回调能够知道在发生错误时哪个联系人失败。查看是否需要引用。

除了回调结构之外,代码还有一些问题

var contacts = req.body;
(function(res, contacts) {

   ...

})(); // function
^您正在参数列表中重新定义
联系人
res
,但没有传入任何参数,因此在函数中
res
联系人
将是
未定义的

另外,不确定您的
self
变量来自何处,但可能您在其他地方定义了它

至于回调结构,您正在寻找类似的内容(假设contacts是一个数组):

但是,您可能需要考虑并行执行数据库的保存。大概是这样的:

var savesPending = contacts.length;
var saveCallback = function (i, err) {
  if (err)
    console.log('Saving contact ' + i + ' failed.');

  if (--savesPending === 0)
    res.json('finished');
};

for (var i in contacts) {
  ...
  newContact.save(saveCallback.bind(null, i));
}
这样,您就不必等待每次保存完成后再开始下一次数据库往返


如果您不熟悉我为什么使用
saveCallback.bind(null,I)
,那么基本上是为了让回调能够知道在发生错误时哪个联系人失败。查看是否需要引用。

(最后一个包含与您类似的代码段)(最后一个包含与您类似的代码段)(最后一个包含与您类似的代码段)(最后一个包含与您类似的代码段)我建议使用一些异步流控制模块来处理异步for循环。是最容易开始的。@LeonidBeschastny我尽量不回答像这样的问题,只回答“使用库”,因为我认为自己做几次可以帮助新手理解异步概念,并为他们提供做更多事情的工具。但是,从长远来看,使用类似async的库,特别是在本例中使用
async.each()
,将是一个好主意。我建议使用一些异步流控制模块来处理async for循环。是最容易开始的。@LeonidBeschastny我尽量不回答像这样的问题,只回答“使用库”,因为我认为自己做几次可以帮助新手理解异步概念,并为他们提供做更多事情的工具。但是,从长远来看,使用类似async的库,特别是在本例中使用
async.each()
,将是一个好主意。我建议使用一些异步流控制模块来处理async for循环。是最容易开始的。@LeonidBeschastny我尽量不回答像这样的问题,只回答“使用库”,因为我认为自己做几次可以帮助新手理解异步概念,并为他们提供做更多事情的工具。但是,从长远来看,使用类似async的库,特别是在本例中使用
async.each()
,将是一个好主意。我建议使用一些异步流控制模块来处理async for循环。是最容易开始的。@LeonidBeschastny我尽量不回答像这样的问题,只回答“使用图书馆”