我正在使用自定义模型并尝试使用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方法?请帮忙。
由于
答案 0 :(得分:3)
您可以使用async package中的每个功能解决此问题。例如:
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
}
});
答案 1 :(得分:2)
所有这些模型方法(查询/更新数据)都是异步的。没有同步版本。相反,您需要使用作为第二个参数传递的回调函数:
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') { ... }
} );
}
答案 2 :(得分:0)
java.lang.IllegalStateException: This job has not completed yet