Javascript 下面代码的执行顺序以及原因?

Javascript 下面代码的执行顺序以及原因?,javascript,promise,Javascript,Promise,主要是“promise2”和“async1 end”的顺序。我不知道为什么。 async函数async2(){ log(“async2”); } 新承诺(解决=>{ 解析(async2()); }).然后(()=>{ log(“async1-end”); }); 新承诺(功能(解决){ 控制台日志(“承诺1”); 解决(); }).然后(函数(){ 控制台日志(“承诺书2”); }); 与以下内容大致相同: resolve(Promise.resolve()) 因此,它创造了一个将解决的承诺,

主要是“promise2”和“async1 end”的顺序。我不知道为什么。
async函数async2(){
log(“async2”);
}
新承诺(解决=>{
解析(async2());
}).然后(()=>{
log(“async1-end”);
});
新承诺(功能(解决){
控制台日志(“承诺1”);
解决();
}).然后(函数(){
控制台日志(“承诺书2”);
});
与以下内容大致相同:

resolve(Promise.resolve())
因此,它创造了一个将解决的承诺,并将其传递给另一个承诺的解决方案。随着承诺变得平淡(用承诺解决承诺会让外部承诺等待内部承诺),您的示例可以简化为:

 Promise.resolve("first").then(console.log);

 Promise.resolve("second")
   .then(it => it) 
   .then(console.log);
现在,解析承诺保证是异步的,因此即使您像在您的案例中那样同步解析它,
。那么
回调只会在1个刻度后调用。现在,第一个将在一次勾选后记录,第二个也将在一次勾选后解析,然后链接承诺将解析,然后等待另一次勾选,直到第三次勾选完成

因此,“promise2”将在一个刻度后记录,而“async1 end”将在两个刻度后记录



然而,你不应该依赖于承诺的执行顺序。

你为什么在意?它们是独立的承诺链,回调应该以任何顺序发生。对于我发布的代码,我不这么认为。承诺只保证
async1 end
发生在
async2
之后,而
promise2
发生在
promise1
之后。当然,这个实现是确定性的,我们可以解释为什么会因为排队的顺序而得到结果,但不应该依赖于此。如果您需要保证回调之间的顺序,请显式链接它们。我知道。我只想知道事件循环的原理,以及宏任务和微任务的执行顺序。你知道关于它的任何文档吗?@Angelki宏任务和微任务之间的区别在这里并不重要,你只在代码中得到承诺——所有异步处理程序都由同一个队列处理。
 Promise.resolve("first").then(console.log);

 Promise.resolve("second")
   .then(it => it) 
   .then(console.log);