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.