[英]promise Q not working consistently
我正在使用promise的Q库,我有一个基本的问题我已经创建了此代码,当我省略第一个返回Q字时,我得到了错误(返回Q(100)),但是对于第二个和第三个,则没有如果我忽略它们,问题仍然存在,为什么?
function firstFn() {
return Q(100);
};
function secFn(){
return Q(200);
};
function thirdFn(){
return q(300);
};
firstFn().then(function(a){
alert(a);
return secFn();
}).then(function(b){
alert(b);
return thirdFn();
}).then(function(c){
alert(c)
});
您正在对从firstFn返回的值调用.then(function(a)...),因此它需要返回上面带有.then函数的内容。
对于其他两个函数,您正在Q .then()回调中调用它们。 如果您从这些回调中返回承诺,则Q将利用它们,但如果您不返回任何内容,则Q也可以。
详细阐述罗伯特·利维说的话:
Promises / A +规范指定了Q的工作方式,该规范规定,只要从.then
回调返回值.then
就将其作为承诺进行包装。
调用Q(foo)
所做的与Promise.resolve(foo)
所做的相似,是将事物包装为一个承诺。 因此Q(100)是对值100的承诺。每当从then
回调返回一个值时,它都会被“包装”。
Q(100);
Q().then(function(){ return 100; }); // the same as the line above
Q.try(function(){ return 100; }); // same as line above
// or in ES6 native promises or bluebird promises
Promise.resolve(100);
Promise.resolve().then(function(){ return 100; }); // the same as the line above
明确地说,该规范说明了.then
回调参数:
如果
onFulfilled
或onRejected
返回值x,请运行Promise Resolution Procedure [[Resolve]](promise2,x)。
承诺解决程序指出:
如果x是一个承诺,则采用其状态[3.4] :(请注意:不是我们的情况)
否则,如果x是对象或函数,
then
让x.then
。 [3.5]如果
then
不是函数,则用x履行承诺
因此,Q这样做是可以的,这使我们的生活更轻松,并使我们能够像承诺一样吸收价值。 原因是我们希望保持.then
链的外观异步,因此返回值实际上只是在履行我们包装的新承诺
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.