Цепочка Promises в Coffeescript
Есть ли способ связать Promises
вместе в Coffeescript. Например, рассмотрим следующий код javascript,
return $.getJSON('/api/post.json')
.then(function(response) {
// do something
})
.then(function(response) {
// do something
})
.then(null, function(err) {
// do something
});
Каждый из then's
является необязательным, и конечная then
должна быть возвращена функцией.
В настоящее время я пишу это в coffeescript как
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
Есть ли лучший способ сделать это? Спасибо.
Ответы
Ответ 1
Иезекииль показывает правильный путь, но ему не нужны круглые скобки вокруг функций. Просто выполните:
$.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
Я думаю, что это удивительно чисто.
Единственное, что относительно беспорядочно, - это когда вы должны одновременно добавлять onRejected и onFulfilled обработчики.
Примечание. В прошлый раз, когда я проверил, это не сработало в CoffeeScript Redux, но это было несколько месяцев назад.
Примечание 2. Для этого вам нужно, по крайней мере, одна строка фактического кода (т.е. не только комментарий) в каждом теле функции. Как правило, вы будете, поэтому это не большая проблема.
Ответ 2
Это мой личный любимый способ написать promises с небольшим дополнительным отступом
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'
Что компилируется:
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');
});
Есть случаи, когда это тоже очень хорошо работает:
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)
Протестировано на кофе script v1.6.3
Ответ 3
Это, вероятно, лучшее, что вы сделаете:
$.getJSON('/api/post.json')
.then( (response) ->
# do something
).then( (response) ->
# do something
).then null, (err) ->
# do something
Обратите внимание на круглые скобки, окружающие аргументы then()
. Ничто не разрушает землю, но, надеюсь, это помогает.