Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺Q不能始终如一地工作_Javascript_Jquery_Asynchronous_Promise_Q - Fatal编程技术网

Javascript 承诺Q不能始终如一地工作

Javascript 承诺Q不能始终如一地工作,javascript,jquery,asynchronous,promise,q,Javascript,Jquery,Asynchronous,Promise,Q,我正在使用承诺的Q库,我有一些基本问题 我已经创建了这段代码,当我省略第一个返回的Q字时,我得到了一个错误(返回Q(100)),但是对于第二个和第三个,如果我省略它们就没有问题了,代码仍然在工作,为什么 function firstFn() { return Q(100); }; function secFn(){ return Q(200); }; function thirdFn(){ return 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)
    });
您正在对firstFn返回的值调用.then(函数(a)…),因此它需要返回包含.then函数的内容


对于其他两个函数,您将在Q.then()回调中调用它们。如果您从这些回调中返回一个承诺,Q将利用它们,但如果您不返回任何东西,Q也可以。

要详细说明Robert Levy所说的话:

Promissions/A+specification指定Q的工作方式,它指示无论何时从
回调返回值,它都将作为Promission展开

调用
Q(foo)
所做的,类似于
Promise.resolve(foo)
所做的,就是将事物包装为一个承诺。所以Q(100)是对值100的承诺。当一个值从
返回,然后从
回调返回时,它被“包装”


为了清楚起见,规范说明了
。然后
回调参数:

如果
onCompleted
onRejected
返回值x,则运行承诺解决过程[[Resolve]](promise2,x)

承诺解决程序规定:

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

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

  • then
    be
    x.then
    。[3.5]

  • 如果
    那么
    不是一个函数,用x来履行承诺


所以,Q可以这样做,这让我们的生活更轻松,让我们把价值观当作承诺。原因是我们希望保持
的外观。然后
链异步,因此返回一个值实际上只是实现了我们正在包装的新承诺(

1+用于elaborting:),只是为了验证我得到了它,Q与Q相同,但就像简单地编写它一样。如果是这样,如何使用Q进行链?我不是在说Q。因为顺序很重要…@AlBundy用承诺链接的方法是使用
。然后
-把
。然后
看作是分号上的抽象-这就是承诺中链接的工作方式<然后,(第二个FN)。然后(第三个FN)< /代码> -考虑看承诺教程-他们通常包括:)我在谈论你写的例子Q(100);然后(函数(){return 100;}),第一行与第二行相同,假设我想使用第一行(Q(100)),我应该如何使用这种语法,请提供示例。提前感谢您的意思是类似
Q(100)。然后(函数(v){console.log(v);返回Q(200);})。然后(函数(x){console.log(x);返回Q(300);})
@AlBundy我刚刚给了你一个向上投票的机会,这意味着-如果你想讨论具体细节,欢迎你在那里提问。我不想在评论中加入其他“太具体”的内容,因为这会让阅读这个问题的未来用户更加困难。
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