有没有办法在Coffeescript中将Promises
链接在一起。例如,请考虑以下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
有更好的方法吗?感谢。
答案 0 :(得分:42)
Ezekiel以正确的方式显示,但它不需要围绕函数的括号。只是做:
$.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:在每个函数体中至少需要一行实际代码(即不仅仅是注释)才能使其工作。通常,你会,所以这不是一个大问题。
答案 1 :(得分:13)
这是我个人最喜欢写承诺的方式,还有一点额外的缩进
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)
在咖啡脚本v1.6.3上测试
答案 2 :(得分:4)
这可能是你做的最好的事情:
$.getJSON('/api/post.json')
.then( (response) ->
# do something
).then( (response) ->
# do something
).then null, (err) ->
# do something
请注意围绕then()
参数的括号。什么都没有惊天动地,但希望这会有所帮助。