2011-02-28 90 views
64

在CoffeeScript中鏈接方法的最佳方式是什麼?例如,如果我有這個JavaScript,我怎樣才能在CoffeeScript中編寫它?使用函數參數鏈接方法

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

回答

70

使用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(); 
}); 
+2

這太棒了。謝謝,這是一種讓操作員首先進入下一行的語言,而不是難以理解的拖尾語法。萬歲! – 2012-10-31 23:11:09

+2

值得注意的是,在Coffeescript 1.7的'foo.html'附近不再需要parens(請參閱下面的答案) – 2014-02-18 16:27:48

37

有您可以採取兩種方法:最好的「文字」翻譯的CoffeeScript的是(在我看來)

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

另一種方法是將內聯函數「綱要」一風格傑里米阿什克納斯(的CoffeeScript的創建者)通常有利於用於非平凡函數參數:

onSuccess = (response) -> 
    # doSomething 

onError = -> 
    # doSomething 

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

後一種方法更趨於可讀當successerror回調是幾行長;如果他們只有1-2個內線,前者是非常棒的。

+2

+1,爲「綱要」提示,絕對保持代碼更具可讀性。 – 2011-08-10 12:21:05

11

我有時喜歡有更少的括號,而不是鏈接,所以我修改Trevor的最後一個例子:

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

這與鏈接不同,因爲req對象每次都在使用 – 2015-03-13 20:55:43

9

從Coffeescript 1.7開始,鏈接已經顯着簡化被誇大了,你不應該需要這裏提到的與parens相關的任何變通辦法。你上面的例子,現在可以寫成

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

+0

這是很棒的信息。 – 2014-03-04 05:39:21