Method chaining with function arguments
Solution 1
Using the latest CoffeeScript, the following:
req = $.get 'foo.html'
.success (response) ->
do_something()
.error (response) ->
do_something()
...compiles to:
var req;
req = $.get('foo.html').success(function(response) {
return do_something();
}).error(function(response) {
return do_something();
});
Solution 2
There are two approaches you can take: The best "literal" translation to CoffeeScript is (in my opinion)
req = $.get('foo.htm')
.success((response) ->
# do something
)
.error( ->
# do something
)
The other approach is to move the inline functions "outline," a style that Jeremy Ashkenas (the creator of CoffeeScript) generally favors for non-trivial function arguments:
onSuccess = (response) ->
# doSomething
onError = ->
# doSomething
req = $.get('foo.htm').success(onSuccess).error(onError)
The latter approach tends to be more readable when the success
and error
callbacks are several lines long; the former is great if they're just 1-2 liners.
Solution 3
I sometimes prefer having fewer parentheses as opposed to chaining, so I'd modify Trevor's last example:
req = $.get 'foo.htm'
req.success (response) -> # do something
req.error -> # do something
Solution 4
As of Coffeescript 1.7, chaining has been significantly simplified, and you shouldn't need any of the parens-related workarounds mentioned here. Your above example can now be written as
req = $.get 'foo.htm'
.success ( response ) ->
alert "success"
.error ->
alert "error"
Which compiles to
var req;
req = $.get('foo.htm').success(function(response) {
return alert("success");
}).error(function() {
return alert("error");
});
You can see an explanation of this and other CS 1.7 features here: https://gist.github.com/aseemk/8637896
nicholaides
I'm a software engineer and cofounder of PromptWorks, the premier Ruby and web consultancy in Philadelphia.
Updated on June 06, 2022Comments
-
nicholaides almost 2 years
What's the best way to chain methods in CoffeeScript? For example, if I have this JavaScript how could I write it in CoffeeScript?
var req = $.get('foo.htm') .success(function( response ){ // do something // ... }) .error(function(){ // do something // ... });
-
Mark Rendle over 12 years+1 for the "outline" tip, definitely keeps the code more readable.
-
Walt W over 11 yearsThis is awesome. Thank you, a language that puts the operator first on the next line rather than awkward trailing syntaxes. Hooray!
-
Ben McCormick about 10 yearsworth noting that the parens are no longer necessary around the 'foo.html' in Coffeescript 1.7 (see my answer below)
-
Jagtesh Chadha about 9 yearsThis is not the same as chaining, as req object is being used each time