Node.js / Sails.js - forEach循环中的函数

时间:2015-07-21 23:59:06

标签: javascript node.js asynchronous promise sails.js

我正在尝试让以下简化代码完成,然后继续同步:

factors.forEach(function(factor, index){
  Factor.findOrCreate({function_name: factor}).exec(function(){
    sails.log('success');
  })
});

我该怎么做?

到目前为止,我已经尝试过:

  • 将第2-4行放在一个单独的函数中并从中调用它 环
  • 使用async.js async.series()调用

但是虽然它会执行调用(打印'成功'),但它很少会在数据库中找到或创建一个因子,因此它与代码的异步性质有关。

  • 使用promises等待所有findOrCreate()调用返回,然后继续

    var promises = [];
    factors.forEach(function(factor, index){
      promises.push(Factor.findOrCreate({function_name: factor}));
    });
    Q.all(promises).then(function(){
      sails.log('success');
    });
    

我已经尝试了这个版本的几个版本,但我仍然无法打印出“成功” - 这似乎是正确的方法,但我不太确定是什么问题。

3 个答案:

答案 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以来已经过了几个月(不幸的是)。