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