在map()之后只调用一次函数

时间:2015-12-28 20:57:56

标签: javascript node.js

我在Nodejs上遇到问题,我需要在item.IS_RACING === 1

时只调用一次函数

外观

    _.map(recordsets, function(items) {
      return _.map(items, function(item) {
        if (item.IS_RACING === 1) {
          _this.getRacing();
        }
      });
    });

每次条件为_this.getRacing();时,我都会调用true,但如果有IS_RACING === 1的项目,那么函数_this.getRacing();将是打电话20次。我需要一些类似的功能,一旦应用检测到第一个IS_RACING === 1出现的时间,然后只触发_this.getRacing();一次。

任何建议?

3 个答案:

答案 0 :(得分:6)

正如Pointy在评论中指出(抱歉),您真的不想使用map()来执行此操作。

根据您如何向其他开发人员解释问题来思考问题。

  

如果任何记录集中有一个竞赛项目,我想致电getRacing()

现在,编写代表你意图的代码。

var somethingIsRacing = _.some(recordsets, function(items) {
  return _.some(items, function(item) {
    return item.IS_RACING === 1;
  });
});
if(somethingIsRacing) {
  _this.getRacing();
}

此代码遵循一个称为命令查询分离的原则,您首先使用功能编程样式查询所需信息,然后执行具有副作用的操作命令式编程风格。

答案 1 :(得分:0)

标志变量通常可以解决问题:

var getRacingCalled = false;
_.map(recordsets, function(items) {
  return _.map(items, function(item) {
    if (item.IS_RACING === 1 && !getRacingCalled) {
      _this.getRacing();
      getRacingCalled = true;
    }
  });
});

答案 2 :(得分:0)

尝试用闭包来做:

var closure = (function() {
    var fired = false;
    return function (item) {
        if (!fired && item.IS_RACING === 1) {
            fired = true;
            _this.getRacing();
        }
    }; 
})();

_.map(recordsets, function(items) {
      return _.map(items, closure(item));
});