我正在使用自定义模型,并尝试使用find方法在循环中对其进行过滤。例如在下面给出
for i = 0 to n
{
var u = User.find( where { name: 'john'});
}
不起作用。
此外,如果我使用以下内容
for i = 0 to n
{
User.find( where { name: 'john'}, function(u) {... } );
// How do I call the code for further processing?
}
是否有一种方法可以同步调用find方法?请帮助。
谢谢
您可以使用async package中的each功能来解决。示例:
async.each(elements, function(element, callback) {
// - Iterator function: This code will be executed for each element -
// If there's an error execute the callback with a parameter
if(error)
{
callback('there is an error');
return;
}
// If the process is ok, execute the callback without any parameter
callback();
}, function(err) {
// - Callback: this code will be executed when all iterator functions have finished or an error occurs
if(err)
console.log("show error");
else {
// Your code continues here...
}
});
通过这种方式,您的代码是异步的(迭代器函数同时执行),除了将在所有步骤完成后执行的回调函数。
您的代码示例为:
var elements = [1 .. n];
async.each(elements, function(element, callback) {
User.find( where { name: 'john'}, function(u) {
if(err)
{
callback(err);
return;
}
// Do things ...
callback();
});
}, function(err) {
if(err)
console.log("show error");
else {
// continue processing
}
});
所有这些模型方法(查询/更新数据)都是异步的。没有同步版本。相反,您需要使用作为第二个参数传递的回调函数:
for (var i = 0; i<n; ++i) {
User.find( {where: { name: 'john'} }, function(err, users) {
// check for errors first...
if (err) {
// handle the error somehow...
return;
}
// this is where you do any further processing...
// for example:
if (users[0].lastName === 'smith') { ... }
} );
}
async myFunction(){
for(var i = 0; i < n; i++) {
var u = await User.find( {where { name: 'john'}});
}
}