web-dev-qa-db-ja.com

関数の引数によるメソッドの連鎖

CoffeeScriptでメソッドをチェーンする最良の方法は何ですか?たとえば、このJavaScriptがある場合、どのようにしてCoffeeScriptで記述できますか?

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

最新の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();
});
71
a paid nerd

あなたが取ることができる2つのアプローチがあります:CoffeeScriptへの最高の「リテラル」翻訳は(私の意見では)です

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

もう1つのアプローチは、インライン関数を「アウトライン」に移動することです。これは、Jeremy Ashkenas(CoffeeScriptの作成者)が一般的に重要な関数引数を優先するスタイルです。

onSuccess = (response) ->
  # doSomething

onError = ->
  # doSomething

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

後者の方法は、successおよびerrorコールバックが数行の長さの場合に、より読みやすくなる傾向があります。前者は、ライナーが1〜2枚の場合に最適です。

37
Trevor Burnham

連鎖ではなく、括弧の数を少なくしたい場合があるので、Trevorの最後の例を変更します。

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

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

9
Ben McCormick