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(不幸的是)几个月以来。