Method chaining with function arguments

前端 未结 4 1524
囚心锁ツ
囚心锁ツ 2021-01-30 12:40

What\'s the best way to chain methods in CoffeeScript? For example, if I have this JavaScript how could I write it in CoffeeScript?

var req = $.get(\'foo.htm\')
         


        
相关标签:
4条回答
  • 2021-01-30 12:52

    There are two approaches you can take: The best "literal" translation to CoffeeScript is (in my opinion)

    req = $.get('foo.htm')
      .success((response) ->
        # do something
      )
      .error( ->
        # do something
      )
    

    The other approach is to move the inline functions "outline," a style that Jeremy Ashkenas (the creator of CoffeeScript) generally favors for non-trivial function arguments:

    onSuccess = (response) ->
      # doSomething
    
    onError = ->
      # doSomething
    
    req = $.get('foo.htm').success(onSuccess).error(onError)
    

    The latter approach tends to be more readable when the success and error callbacks are several lines long; the former is great if they're just 1-2 liners.

    0 讨论(0)
  • 2021-01-30 13:00

    Using the latest CoffeeScript, the following:

    req = $.get 'foo.html'
      .success (response) ->
        do_something()
      .error (response) ->
        do_something()
    

    ...compiles to:

    var req;
    req = $.get('foo.html').success(function(response) {
      return do_something();
    }).error(function(response) {
      return do_something();
    });
    
    0 讨论(0)
  • 2021-01-30 13:11

    As of Coffeescript 1.7, chaining has been significantly simplified, and you shouldn't need any of the parens-related workarounds mentioned here. Your above example can now be written as

    req = $.get 'foo.htm'
    .success ( response ) ->
      alert "success"
    .error ->
      alert "error"
    

    Which compiles to

    var req;
    
    req = $.get('foo.htm').success(function(response) {
      return alert("success");
    }).error(function() {
      return alert("error");
    });
    

    You can see an explanation of this and other CS 1.7 features here: https://gist.github.com/aseemk/8637896

    0 讨论(0)
  • 2021-01-30 13:15

    I sometimes prefer having fewer parentheses as opposed to chaining, so I'd modify Trevor's last example:

    req = $.get 'foo.htm'
    req.success (response) -> # do something
    req.error -> # do something
    
    0 讨论(0)
提交回复
热议问题