Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 为什么JS Promise.then()在resolve()之前求值_Javascript_Promise - Fatal编程技术网

Javascript 为什么JS Promise.then()在resolve()之前求值

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=新的承诺人职能承

我一直在玩承诺游戏,我把下面的代码放在一起,它的行为不像我期望的那样。你可以在这里用小提琴演奏:

函数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; }; 接收两个参数:一个是在承诺成功解析时触发的函数,另一个是在承诺被拒绝时调用的函数

在您的示例中,您将传递一个新的期票作为参数

为了实现您的目标链,我建议如下:

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请检查答案的编辑版本,现在它的行为和预期的一样。