tutorial coffeescript

tutorial - coffeescript vs javascript



Promesas de encadenamiento en Coffeescript (3)

Esta es mi forma personal favorita de escribir promesas, con un poco de sangría extra

doSomething = () -> new RSVP.Promise (resolve, reject) -> if 1 is 1 resolve ''Success'' else reject ''Error'' doSomething() .then (res) -> console.log ''Step 1 Success Handler'' , (err) -> console.log ''Step 1 Error Handler'' .then (res) -> console.log ''Step 2 Success Handler'' .then (res) -> console.log ''Step 3 Success Handler'' , (err) -> console.log ''Step 3 Error Handler''

Que compila a:

var doSomething; doSomething = function() { return new RSVP.Promise(function(resolve, reject) { if (1 === 1) { return resolve(''Success''); } else { return reject(''Error''); } }); }; doSomething().then(function(res) { return console.log(''Step 1 Success Handler''); }, function(err) { return console.log(''Step 1 Error Handler''); }).then(function(res) { return console.log(''Step 2 Success Handler''); }).then(function(res) { return console.log(''Step 3 Success Handler''); }, function(err) { return console.log(''Step 3 Error Handler''); });

Hay algunos casos en los que esto también funciona muy bien:

step1Success = (res) -> console.log ''Step 1 Success Handler'' step1Error = (err) -> console.log ''Step 1 Error Handler'' step2Success = (res) -> console.log ''Step 2 Success Handler'' step3Success = (res) -> console.log ''Step 3 Success Handler'' step3Error = (err) -> console.log ''Step 3 Error Handler'' doSomething() .then(step1Success, step1Error) .then(step2Success) .then(step3Success, step3Error)

Probado en coffee-script v1.6.3

¿Hay una manera de encadenar Promises juntos en Coffeescript. Por ejemplo, considere el siguiente código javascript,

return $.getJSON(''/api/post.json'') .then(function(response) { // do something }) .then(function(response) { // do something }) .then(null, function(err) { // do something });

Cada uno de los de then''s es opcional, y el final debe ser devuelto por la función. Actualmente estoy escribiendo esto en coffeescript como,

promise = $.getJSON(''/api/post.json'') promise = promise.then (response) -> // do something promise = promise.then (response) -> // do something promise = promise.then null, (err) -> // do something return promise

¿Hay una mejor manera de hacer esto? Gracias.


Esto es probablemente lo mejor que harás:

$.getJSON(''/api/post.json'') .then( (response) -> # do something ).then( (response) -> # do something ).then null, (err) -> # do something

Tenga en cuenta los paréntesis que rodean los argumentos de then() . Nada estremecedor de la tierra, pero espero que esto ayude.


Ezequiel muestra el camino correcto, pero no necesita los paréntesis alrededor de las funciones. Solo haz:

$.getJSON ''/api/post.json'' # As of CoffeeScript 1.7, you don''t need the parentheses here either. .then (response) -> # do something response # if you would not return anything, promise would be fulfilled with undefined .then (response) -> # do something undefined # necessary to prevent empty function body .then null, (err) -> # handle error

Creo que es sorprendentemente limpio. Lo único que es relativamente desordenado es cuando necesita agregar al mismo tiempo controladores onRejected y onFulfilled.

Nota: la última vez que lo comprobé, esto no funcionó en CoffeeScript Redux, pero fue hace unos meses.

Nota 2: Necesita al menos una línea de código real (es decir, no solo un comentario) en cada cuerpo de función para que esto funcione. Típicamente, lo harás, así que no es un gran problema.