2011-02-28 15 views
64

¿Cuál es la mejor manera de encadenar métodos en CoffeeScript? Por ejemplo, si tengo este JavaScript, ¿cómo podría escribirlo en CoffeeScript?Método de encadenamiento con argumentos de función

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

Respuesta

70

Usando the latest CoffeeScript, lo siguiente:

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

... compila a:

var req; 
req = $.get('foo.html').success(function(response) { 
    return do_something(); 
}).error(function(response) { 
    return do_something(); 
}); 
+2

Esto es asombroso. Gracias, un lenguaje que pone al operador primero en la siguiente línea en lugar de sintaxis complicadas. ¡Hurra! –

+2

, vale la pena señalar que los parens ya no son necesarios alrededor de 'foo.html' en Coffeescript 1.7 (ver mi respuesta a continuación) –

37

Hay dos enfoques que puede tomar: La mejor traducción "literal" a CoffeeScript es (en mi opinión)

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

El otro enfoque es mover las funciones en línea "contorno", una estilo que Jeremy Ashkenas (el creador de CoffeeScript) favorece generalmente para los argumentos de funciones no triviales:

onSuccess = (response) -> 
    # doSomething 

onError = -> 
    # doSomething 

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

el último enfoque tiende a ser más legible cuando el success y error devoluciones de llamada son varias líneas de longitud; el primero es genial si solo tienen 1 o 2 líneas.

+2

+1 para el "esquema" consejo, definitivamente mantiene el código más legible. –

11

veces prefiero tener menos de paréntesis, a diferencia de encadenamiento, así que yo modifico último ejemplo de Trevor:

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

Esto no es lo mismo que encadenar, ya que el objeto req se está usando cada vez –

9

A partir de Coffeescript 1.7, el encadenamiento ha sido significativamente simp lified, y no debería necesitar ninguna de las soluciones parciales relacionadas con parens mencionadas aquí. Su ejemplo anterior se puede escribir como

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

que compila a

var req; 

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

Se puede ver una explicación de este y otros CS 1.7 características aquí: https://gist.github.com/aseemk/8637896

+0

Esta es una gran información. –

Cuestiones relacionadas