带有函数参数的方法链接

Posted

技术标签:

【中文标题】带有函数参数的方法链接【英文标题】:Method chaining with function arguments 【发布时间】:2011-07-05 21:03:02 【问题描述】:

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

var req = $.get('foo.htm')
  .success(function( response )
    // do something
    // ...
  )
  .error(function()
    // do something
    // ...
  );

【问题讨论】:

【参考方案1】:

您可以采用两种方法:CoffeeScript 的最佳“字面”翻译是(在我看来)

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

另一种方法是移动内联函数“大纲”,这是 Jeremy Ashkenas(CoffeeScript 的创建者)通常喜欢用于非平凡函数参数的样式:

onSuccess = (response) ->
  # doSomething

onError = ->
  # doSomething

req = $.get('foo.htm').success(onSuccess).error(onError)

successerror 回调有几行长时,后一种方法往往更具可读性;如果它们只是 1-2 衬里,前者很棒。

【讨论】:

+1 表示“大纲”提示,绝对让代码更具可读性。【参考方案2】:

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

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

【讨论】:

这与链式不同,因为每次都在使用 req 对象【参考方案3】:

使用the latest CoffeeScript,如下:

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

...编译为:

var req;
req = $.get('foo.html').success(function(response) 
  return do_something();
).error(function(response) 
  return do_something();
);

【讨论】:

这太棒了。谢谢,这是一种将运算符放在下一行而不是笨拙的尾随语法的语言。万岁! 值得注意的是,Coffeescript 1.7 中的 'foo.html' 周围不再需要括号(请参阅下面的答案)【参考方案4】:

从 Coffeescript 1.7 开始,链接已经大大简化,您不需要这里提到的任何与括号相关的变通方法。你上面的例子现在可以写成

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

编译成

var req;

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

您可以在此处查看有关此功能和其他 CS 1.7 功能的说明:https://gist.github.com/aseemk/8637896

【讨论】:

以上是关于带有函数参数的方法链接的主要内容,如果未能解决你的问题,请参考以下文章

透明地通过带有可变参数列表的函数

基于 Python 类的装饰器,带有可以装饰方法或函数的参数

带有可选参数的 PHP 函数

传递给角度指令的链接函数的实例元素参数是啥对象类型?

[Catel]如何将带有构造函数参数的 ViewModel 传递给 TabService 扩展方法?

如何使用 JNI 从 JAVA 调用带有 C++ 参数的函数?