Javascript 承诺Q不能始终如一地工作
我正在使用承诺的Q库,我有一些基本问题 我已经创建了这段代码,当我省略第一个返回的Q字时,我得到了一个错误(返回Q(100)),但是对于第二个和第三个,如果我省略它们就没有问题了,代码仍然在工作,为什么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
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
bex.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