用函数参数链接的方法

nic*_*des 65 javascript syntax coffeescript

在CoffeeScript中链接方法的最佳方法是什么?例如,如果我有这个JavaScript,我怎么能用CoffeeScript编写它?

var req = $.get('foo.htm')
  .success(function( response ){
    // do something
    // ...
  })
  .error(function(){
    // do something
    // ...
  });
Run Code Online (Sandbox Code Playgroud)

a p*_*erd 71

使用最新的CoffeeScript,如下:

req = $.get 'foo.html'
  .success (response) ->
    do_something()
  .error (response) ->
    do_something()
Run Code Online (Sandbox Code Playgroud)

...汇编到:

var req;
req = $.get('foo.html').success(function(response) {
  return do_something();
}).error(function(response) {
  return do_something();
});
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了.谢谢你,这种语言将运算符放在下一行而不是笨拙的尾随语法.万岁! (2认同)
  • 值得注意的是,Coffeescript 1.7中的'foo.html'周围不再需要parens(请参阅下面的答案) (2认同)

Tre*_*ham 37

您可以采取两种方法:对CoffeeScript的最佳"文字"翻译(在我看来)

req = $.get('foo.htm')
  .success((response) ->
    # do something
  )
  .error( ->
    # do something
  )
Run Code Online (Sandbox Code Playgroud)

另一种方法是移动内联函数"outline",这是Jeremy Ashkenas(CoffeeScript的创建者)通常偏爱非平凡函数参数的一种风格:

onSuccess = (response) ->
  # doSomething

onError = ->
  # doSomething

req = $.get('foo.htm').success(onSuccess).error(onError)
Run Code Online (Sandbox Code Playgroud)

success并且error回调是多行时,后一种方法往往更具可读性; 前者很棒,如果他们只有1-2个衬里.

  • 对于"大纲"提示+1,肯定会使代码更具可读性. (2认同)

Ami*_*mir 11

我有时更喜欢使用较少的括号而不是链接,所以我会修改Trevor的最后一个例子:

req = $.get 'foo.htm'
req.success (response) -> # do something
req.error -> # do something
Run Code Online (Sandbox Code Playgroud)

  • 这与链接不同,因为每次都使用req对象 (2认同)

Ben*_*ick 9

从Coffeescript 1.7开始,链接已被大大简化,您不应该需要任何与此处提到的与parens相关的解决方法.您的上述示例现在可以写为

req = $.get 'foo.htm'
.success ( response ) ->
  alert "success"
.error ->
  alert "error"
Run Code Online (Sandbox Code Playgroud)

编译到哪个

var req;

req = $.get('foo.htm').success(function(response) {
  return alert("success");
}).error(function() {
  return alert("error");
});
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到这个和其他CS 1.7功能的解释:https://gist.github.com/aseemk/8637896