繁体   English   中英

答应Q工作不一致

[英]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回调参数:

如果onFulfilledonRejected返回值x,请运行Promise Resolution Procedure [[Resolve]](promise2,x)。

承诺解决程序指出:

如果x是一个承诺,则采用其状态[3.4] :(请注意:不是我们的情况)

否则,如果x是对象或函数,

  • thenx.then [3.5]

  • 如果then不是函数,则用x履行承诺

因此,Q这样做是可以的,这使我们的生活更轻松,并使我们能够像承诺一样吸收价值。 原因是我们希望保持.then链的外观异步,因此返回值实际上只是在履行我们包装的新承诺

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM