我正在尝试让以下简化代码完成,然后继续同步:
factors.forEach(function(factor, index){
Factor.findOrCreate({function_name: factor}).exec(function(){
sails.log('success');
})
});
我该怎么做?
到目前为止,我已经尝试过:
但是虽然它会执行调用(打印'成功'),但它很少会在数据库中找到或创建一个因子,因此它与代码的异步性质有关。
使用promises等待所有findOrCreate()调用返回,然后继续
var promises = [];
factors.forEach(function(factor, index){
promises.push(Factor.findOrCreate({function_name: factor}));
});
Q.all(promises).then(function(){
sails.log('success');
});
我已经尝试了这个版本的几个版本,但我仍然无法打印出“成功” - 这似乎是正确的方法,但我不太确定是什么问题。
答案 0 :(得分:2)
使用async.js库forEachOf method有一种简单的方法。
前:
var async = require('async');
var promises = [];
async.forEachOf(factors,function(factor, key, callback){
Factor.findOrCreate({function_name: factor}).exec(function(result,err){
if (err) {
callback(err);
} else {
promises.push(result);
callback();
}
});
}, function(err){
if (err) {
console.log("Error: "+err);
} else {
console.log(promises);
}
});
答案 1 :(得分:2)
在不使用async
或promises的情况下执行此操作的简单方法是手动跟踪已处理的记录数:
var ctr = 0;
factors.forEach(function(factor, index){
Factor.findOrCreate({function_name: factor}).exec(function(err, factorObj){
if (err) errorHandler(err);
ctr ++;
if (ctr === factors.length) {
successCallback();
}
});
});
只有在创建了所有successCallback()
个对象后才会调用 Factor
。
<强>更新强>
或者,您可以尝试这样做以避免完全循环:
Factor.findOrCreate(factors).exec(function(err, factorObjArray){
callback(err, factorObjArray);
});
答案 2 :(得分:1)
你需要使用像Q,promises这样的东西。但是以适当的异步方式。
var cb = function(factor) {
var deferred = Q.defer();
Factor.findOrCreate({function_name: factor})
.exec(function(err, factorObj) {
if(err) deferred.reject(err);
deferred.resolve(factorObj);
});
return deferred.promise;
};
var promises = [];
Factor.forEach(function(f) {
promises.push(cb(f));
});
Q.all(promises)
.then(function() { // You can get the params too.
console.log('WE ARE THE CHAMPIONS!!');
})
.fail(function() { // You can get the error params too.
console.log('WE LOOSE');
});
希望它有所帮助!这只是一个例子,自从我停止使用NodeJS和SailsJS以来已经过了几个月(不幸的是)。