Цепочка метода с аргументами функции

Какой лучший способ цеплять методы в CoffeeScript? Например, если у меня есть этот JavaScript, как я могу написать его в CoffeeScript?

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

Ответ 1

Используя последний 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

Есть два подхода, которые вы можете предпринять: лучший "буквальный" перевод на 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)

Последний подход имеет тенденцию быть более читабельным, если обратные вызовы success и error имеют длину несколько строк; первое замечательно, если они всего 1-2 лайнера.

Ответ 3

Я иногда предпочитаю иметь меньше скобок, а не цепочку, поэтому я бы изменил последний пример Тревора:

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

Ответ 4

Как и в случае с 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