Javascript 为什么JS Promise.then()在resolve()之前求值
我一直在玩承诺游戏,我把下面的代码放在一起,它的行为不像我期望的那样。你可以在这里用小提琴演奏: 函数logtxt{ var Fassed=新日期.getTime-开始; console.loglapsed,txt; } 开始=new Date.getTime; var promise=新允诺功能允诺执行人解决、拒绝{ 登录“承诺1执行人”; SetTimeOut上的SetTimeOut函数{ 登录“承诺1超时”; 决议123; }, 500; }; var promise2=新的承诺人职能承诺人2执行或解决,拒绝{ 登录“承诺2执行人”; SetTimeOut上的SetTimeOut函数{ 登录“承诺2超时”; 决议123; }, 1000; }; //序列 许诺 .然后承诺2 .然后,履行承诺的职能{ //TODO:为什么在promise2解决之前执行? 记录“所有承诺完成!”+p; }; 接收两个参数:一个是在承诺成功解析时触发的函数,另一个是在承诺被拒绝时调用的函数 在您的示例中,您将传递一个新的期票作为参数 为了实现您的目标链,我建议如下:Javascript 为什么JS Promise.then()在resolve()之前求值,javascript,promise,Javascript,Promise,我一直在玩承诺游戏,我把下面的代码放在一起,它的行为不像我期望的那样。你可以在这里用小提琴演奏: 函数logtxt{ var Fassed=新日期.getTime-开始; console.loglapsed,txt; } 开始=new Date.getTime; var promise=新允诺功能允诺执行人解决、拒绝{ 登录“承诺1执行人”; SetTimeOut上的SetTimeOut函数{ 登录“承诺1超时”; 决议123; }, 500; }; var promise2=新的承诺人职能承
var promise = new Promise(function (resolve, reject) {
log('in Promise 1 Executor');
setTimeout(function onSetTimeout() {
log('in Promise 1 Timeout');
resolve(123);
}, 2000);
});
var callback = function(val) {
log('received from the first promisse: ' + val)
return new Promise(function (resolve, reject) {
log('in Promise 2 Executor');
setTimeout(function onSetTimeout() {
log('in Promise 2 Timeout');
resolve(456);
}, 2000);
});
}
// Promise.all([promise, promise2]) // parallelize
// sequence
promise
.then(callback)
.then(function(val) {
log('received from the second promisse: ' + val)
log('ALL Promise Done! ');
}
);
这样,您可以运行promisse并将回调函数设置为.then参数。因此,当第一个setTimeout完成时,它将调用resolve并调用回调函数,这将创建一个新的承诺,然后设置新的setTimeout
将输出:
0 "in Promise 1 Executor"
2002 "in Promise 1 Timeout"
2002 "received from the first promisse: 123"
2002 "in Promise 2 Executor"
4002 "in Promise 2 Timeout"
4003 "received from the second promisse: 456"
4003 "ALL Promise Done! "
工作小提琴:
根据@Bergi的评论进行编辑。谢谢。请注意,您背靠背启动了promise1和promise2,没有顺序。。你也可以使用Promise.allYou似乎在寻找Promise.all[Promise,promise2]。没有承诺1我在我的帖子中提到了背靠背的场景;这怎么能解释最后一次承诺没有决心就开枪了?@IvanJouikov你没有给。然后回电话给。。。就这样继续下去。既然promise1被解析了,第二个调用了它的回调。@IvanJouikov,如果then的参数不是函数,那就和noop一样好了。啊,是的,我忘了then函数需要返回一个承诺。。。基本上,在我最初的示例中,我可以用.thenfunction{return promise2;}替换.thenpromise2行……这是一个微妙的变化,但有很大的不同。承诺不容易!谢谢你的帮助!在我最初的示例中,我可以用.thenfunction{return promise2;}替换.thenpromise2行,就是这样。不客气!这是个坏主意,因为promise2中的超时仍然会立即开始,而不是在promise2解析时。如果您想按顺序运行它们,请将promise2的创建放在该回调中;如果您想并行运行它们,请使用Promise.all等待它们。@Bergi您是对的!我编辑了答案。谢谢你的贡献。@IvanJouikov请检查答案的编辑版本,现在它的行为和预期的一样。