0

我的快速应用程序中有一个函数,它在 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');
};
4

1 回答 1

3

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

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

   ...

})(); // function

^ 你在参数列表中重新定义contactsand res,但没有传入任何参数,所以在你的函数中resand contactswill be undefined

此外,不确定您的self变量来自哪里,但也许您在其他地方定义了它。

至于回调结构,你正在寻找这样的东西(假设联系人是一个数组):

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

  var iterator = function (i) {
    if (i >= contacts.length) {
      res.json('finished'); // or call self.response() or whatever
      return;
    }

    contact = contacts[i];
    var newContact  = new Contact(contact);
    newContact.user = req.user.id
    newContact.save(function(err) {
      if (err)
        console.log(err); //if this is really a failure, you should call response here and return

      iterator(i + 1); //re-call this function with the next index
    });

  };

  iterator(0); //start the async "for" loop
};

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

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),基本上是这样回调就可以知道发生错误时哪个联系人失败了。如果您需要参考,请参阅Function.prototype.bind 。

于 2013-11-12T19:35:28.863 回答