Сцепление метода с аргументами функции - PullRequest
65 голосов
/ 28 февраля 2011

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

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

Ответы [ 4 ]

71 голосов
/ 10 мая 2011

Используя последний 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();
});
37 голосов
/ 28 февраля 2011

Вы можете выбрать один из двух подходов: лучший «буквальный» перевод на 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 лайнера.

11 голосов
/ 02 марта 2011

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

req = $.get 'foo.htm'
req.success (response) -> # do something
req.error -> # do something
9 голосов
/ 18 февраля 2014

Начиная с 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

...