web-dev-qa-db-fra.com

Chaînage de méthode avec des arguments de fonction

Quelle est la meilleure façon de chaîner des méthodes dans CoffeeScript? Par exemple, si j'ai ce JavaScript, comment pourrais-je l'écrire en CoffeeScript?

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

En utilisant le dernier CoffeeScript , ce qui suit:

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

... compile pour:

var req;
req = $.get('foo.html').success(function(response) {
  return do_something();
}).error(function(response) {
  return do_something();
});
71
a paid nerd

Il y a deux approches que vous pouvez adopter: La meilleure traduction "littérale" vers CoffeeScript est (à mon avis)

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

L'autre approche consiste à déplacer les fonctions intégrées "contour", un style que Jeremy Ashkenas (le créateur de CoffeeScript) privilégie généralement pour les arguments de fonction non triviaux:

onSuccess = (response) ->
  # doSomething

onError = ->
  # doSomething

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

Cette dernière approche a tendance à être plus lisible lorsque les rappels success et error font plusieurs lignes; le premier est super s'il ne s'agit que de 1-2 doublures.

37
Trevor Burnham

Je préfère parfois avoir moins de parenthèses plutôt que de chaîner, donc je modifierais le dernier exemple de Trevor:

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

Depuis Coffeescript 1.7, le chaînage a été considérablement simplifié et vous ne devriez avoir besoin d'aucune des solutions de contournement liées à Parens mentionnées ici. Votre exemple ci-dessus peut maintenant être écrit comme

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

Qui se compile pour

var req;

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

Vous pouvez voir une explication de cela et d'autres fonctionnalités de CS 1.7 ici: https://Gist.github.com/aseemk/8637896

9
Ben McCormick