q库承诺将值传递给done方法

时间:2014-10-26 01:55:02

标签: javascript promise q

如果done可以通过resolvereject接收值或功能,我正在尝试找到目的以及如何使用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();

2 个答案:

答案 0 :(得分:1)

在承诺中,无论你解决了什么延迟,都是传递给donethen的论据。您可以通过返回不同的值来更改已解析的处理程序内的解析值。像这样

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 - 无论如何都会记录错误。