【问题标题】:Alternative to wrapping all callback functions in anonymous functions in CoffeeScript在 CoffeeScript 中将所有回调函数包装在匿名函数中的替代方法
【发布时间】:2015-10-18 02:32:11
【问题描述】:

我今天开始使用 CoffeeScript,发现自己在需要回调函数时经常使用像 (args...) => @style(args...) 这样的模式。上下文大致如下:

class Parent
  @style: (feature) ->
    if feature
      @insight()

class Child extends Parent
  @insight: ->
    alert 'Sara is awesome'

  @load: ->
    [42].forEach((args...) => @style(args...))

Child.load()

这显示Sara is awesome,这是准确的。如果我只使用[42].forEach(@style)style 最终会得到一个 this 指代父类(我认为?),它不知道 insight

但这很冗长,我的代码中需要大量的回调函数。有没有更优雅、更惯用的方法来解决这个问题?

(在 CoffeeScript 中使用 forEach 是我读过的不好的风格,但在我的实际代码中,我正在使用各种不能仅用 for 循环替换的 Leaflet 函数。)

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    首先要注意的是,您不应该从 Parent 类中调用 insight。类的全部目的是提供封装。所以我要做的第一件事就是将insight 移动到Parent

    要回答您的问题,更惯用的解决方法是使用粗箭头表示法。胖箭头内部的作用是创建一个匿名函数来封装this

    也就是说,最终的代码应该是这样的:

    class Parent
      @style: (feature) =>
        if feature
          @insight()
    
      @insight: ->
        alert 'Sara is awesome'
    
    class Child extends Parent
      @load: ->
        [42].forEach(@style)
    
    Child.load()
    

    希望对您有所帮助。

    编辑

    根据 OP 评论:

    class Parent
      style: (feature) =>
        if feature
          @insight()
    
    class Child extends Parent
      load: ->
        [42].forEach(@style)
    
      insight: ->
        alert 'Sara is awesome'
    
    (new Child()).load()
    

    【讨论】:

    • 谢谢!但是insight 需要是Child 方法。每个孩子都有一个不同的孩子,并且没有合理的默认值(这些类代表地图上的标记类型,每个子类由不同颜色的色调区分)。还有其他Parent 方法确实具有合理的默认值,因此抽象Parent 用于与鸭式解决方案相反的目的。 (只要insight 不在Parent 中,=> 就不会产生正确的结果。)我是否应该在我的示例中添加几个子类以使其更清晰?
    • 哦,我明白了。那讲得通。在这种情况下,问题是当您使用 @ 定义您的方法时,您正在创建一个类方法,类方法不知道子方法,因为继承对实例生效。让我编辑答案,看看是否适合你。
    • 新版本就像一个魅力,谢谢!我不知道继承的这种特性。很高兴知道!
    • 没问题!乐于助人!
    猜你喜欢
    • 2013-05-16
    • 2011-12-23
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多