我正在使用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)
});
答案 0 :(得分:1)
你正在调用.then(function(a)...)对firstFn返回的值,所以它需要返回一个有.then函数的东西。
对于其他2个函数,您将在Q .then()回调中调用它们。如果你从那些回调中返回一个承诺,Q会利用它们但如果你没有返回任何东西,那么Q也可以。
答案 1 :(得分:0)
详细说明Robert Levy所说的话:
Promises / A +规范指定了Q的工作原理,规定每当从.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
链的外观不同步,所以返回一个值实际上只是履行我们正在包装的新承诺