Javascript Node/Express—如何等待循环结束后使用JSON响应
我的express应用程序中有一个函数,可以在For循环中进行多个查询,我需要设计一个回调,在循环完成时用JSON响应。但是,我还不确定如何在Node中执行此操作。这是我到目前为止所拥有的,但它还没有发挥作用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
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我尽量不回答像这样的问题,只回答“使用图书馆”