如果done
可以通过resolve
或reject
接收值或功能,我正在尝试找到目的以及如何使用q库承诺的完成方法,有人可以解释如何调用done
方法以及如何将任何参数传递给它?
Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
// Do something with value4
})
.catch(function (error) {
// Handle any error from all above steps
})
.done();
答案 0 :(得分:1)
在承诺中,无论你解决了什么延迟,都是传递给done
或then
的论据。您可以通过返回不同的值来更改已解析的处理程序内的解析值。像这样
Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
// Do something with value4
return 'tada!';
})
.catch(function (error) {
// Handle any error from all above steps
})
.done(function(differentValue) {
console.log(differentValue); // outputs "tada!"
});
答案 1 :(得分:1)
Q中.done
的实际目的是处理错误,以免错误被抑制。
如果你在Q中有一个拒绝的保证链,如果你一直使用.then
它会变成一个静默失败,那么下面的代码如下:
Q().then(function(){
var val = JSON.prase(data);
someEffectWith(val);
});
是沉默的失败,你注意到了拼写错误吗?因为从来没有办法知道链何时结束,所以使用.done
让图书馆知道是至关重要的:
Q().done(function(){
var val = JSON.prase(data);
someEffectWith(val);
});
或者:
Q().then(function(){
var val = JSON.prase(data);
someEffectWith(val);
}).done();
两者都会向控制台发出一声红色警告,通知您错误。至于如何调用它具有与.then
完全相同的参数,只是它不返回一个promise,而是返回undefined
,因此你知道你不能链接到它(它终止了链)。
值得一提的是一些promise库,以及firefox中的本机承诺为您执行此操作,并且您不需要在这些库中使用.done
- 无论如何都会记录错误。