承诺Q不能持续工作

时间:2014-11-17 13:52:03

标签: javascript jquery asynchronous promise q

我正在使用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)
    });

2 个答案:

答案 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回调参数:

  

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

承诺解决程序声明:

  

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

     

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

     
      
  • thenx.then。 [3.5]

  •   
  • 如果then不是函数,请使用x

  • 履行承诺   

所以,Q可以做到这一点,这使我们的生活更轻松,并允许我们将价值吸收为承诺。原因是我们希望保持.then链的外观不同步,所以返回一个值实际上只是履行我们正在包装的新承诺