【问题标题】:Call function only once after a map()在 map() 之后只调用一次函数
【发布时间】:2015-12-29 05:10:03
【问题描述】:

我在 Nodejs 上遇到问题,我只需要在 item.IS_RACING === 1 时调用一次函数

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

我有那个_this.getRacing();,每次条件为true时都会调用它,但是如果有20个项目带有IS_RACING === 1,那么函数_this.getRacing();将被调用20次。我需要类似的东西,一旦应用程序检测到第一个 IS_RACING === 1 何时出现,然后只触发一次 _this.getRacing();

有什么推荐吗?

【问题讨论】:

  • 您有多在意使用_.map 来执行此操作?我认为常规的 JS for 循环可能是有序的。
  • _.map() 是错误的 API。使用_.some() 检查列表中的任何项目是否设置了标志。

标签: javascript node.js


【解决方案1】:

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

从如何向其他开发人员解释问题的角度思考问题。

如果任何记录集有正在比赛的项目,我想致电getRacing()

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

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

此代码遵循称为命令-查询分离的原则,您首先使用 函数式 编程风格查询以找到所需的信息,然后使用命令式编程风格。

【讨论】:

  • 我喜欢这个,因为它具有更好的语义含义并且不那么依赖副作用(而不是仅仅循环和设置一些外部标志)。 +1
【解决方案2】:

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

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

【讨论】:

  • @epascarello 在我写答案时已经在 cmets 中说过,所以我添加了一个更通用的标志解决方案。
  • @epascarello 为什么你必须这样?哈哈哈,Shomz,谢谢,祝你们玩得愉快:)
  • @NietzscheProgrammer,没问题! :)
  • 为什么?因为很多时候 OP 会选择这样的答案,因为它们只是工作。有点像用锤子打开窗户。它有效,但有更好的方法来做到这一点。 (仅供参考:我不是-1)
  • 同意,尽管我认为您对窗口/锤子的比喻太过分了,因为标志比仅在这种情况下有效的特定方法更古老且使用更广泛。因此,由于开销的原因,我将比喻更正为用遥控器打开窗户。 ;)
【解决方案3】:

尝试使用闭包:

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));
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2018-07-13
    • 2012-08-23
    相关资源
    最近更新 更多