Node.js / Sails.js – forEach循环中的函数
我试图得到以下简化的代码完成,然后同步:
factors.forEach(function(factor, index){ Factor.findOrCreate({function_name: factor}).exec(function(){ sails.log('success'); }) });
我该怎么做?
到目前为止我已经尝试过:
- 将第2-4行放在一个单独的函数中,并从循环中调用它
- 使用async.js async.series()调用
但是,虽然它会执行调用(打印“成功”),但它会很less在数据库中find或创build一个因子,所以它与代码的asynchronous特性有关。
-
使用promise等待所有findOrCreate()调用返回,然后继续
var promises = []; factors.forEach(function(factor, index){ promises.push(Factor.findOrCreate({function_name: factor})); }); Q.all(promises).then(function(){ sails.log('success'); });
我已经尝试了这个版本的几个版本,但我仍然无法打印“成功” – 这似乎是正确的方式来做到这一点,但我不太清楚什么是错的。
- 问橡皮鸭
不使用async
或承诺的简单方法是手动logging已处理的logging数量:
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(); } }); });
只有在创build了所有的Factor
对象后,才会调用successCallback()
。
更新
或者,你可以试试这个来避免循环:
Factor.findOrCreate(factors).exec(function(err, factorObjArray){ callback(err, factorObjArray); });
有一个使用async.js库forEachOf方法的简单方法 。
例如:
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); } });
你需要使用Q,承诺。 但以适当的asynchronous方式。
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(不幸的是)几个月以来。