我的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


^您正在参数列表中重新定义contactsres,但没有传入任何参数,因此函数rescontacts中将是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

关于javascript - Node/表达-如何等待For Loop结束以JSON响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19937889/

10-11 03:44