Javascript 为什么异步/等待和承诺以不同的方式执行?

Javascript 为什么异步/等待和承诺以不同的方式执行?,javascript,Javascript,异步函数a1(){ 控制台日志(1); 常数数据=等待a2(); //const data=wait new Promise(res=>res())。然后(()=>{console.log(2)}); 控制台日志(5); } 异步函数a2(){ 返回新的承诺(res=>res())。然后(()=>{console.log(2)}) } a1(); 新承诺(功能){ res() }).then(()=>{console.log(3)}) .then(()=>{console.log(4)}) 。然

异步函数a1(){ 控制台日志(1); 常数数据=等待a2(); //const data=wait new Promise(res=>res())。然后(()=>{console.log(2)}); 控制台日志(5); } 异步函数a2(){ 返回新的承诺(res=>res())。然后(()=>{console.log(2)}) } a1(); 新承诺(功能){ res() }).then(()=>{console.log(3)}) .then(()=>{console.log(4)})
。然后(()=>{console.log(6)})您不应该真正依赖订单承诺完成。链
1->2->5
按顺序结束,链
3->4->6
也按顺序结束。你可以保证。但当你没有以任何方式链接两条链时,两条链相互竞争的情况就不会发生了。你的第一个和第二个代码片段在创建承诺的数量和链接方式上并不相同。只要看一眼,如果你写
async函数a1(){console.log(1);const data=wait-wait-wait-new-Promise(res=>res()),那么它们是等价的。然后(()=>{console.log(2)});console.log(5);}
(在另一个
wait
前面加上一个
wait
)@Rounin我只部分同意这一点。在所示的代码中,您只有即时解析承诺,因此不存在任何依赖于IO和仅依赖于事件循环中的队列的情况。因此,如果代码在同一个引擎中反复运行,顺序应该始终相同。但这只适用于这种任意的例子,这里的顺序是完全确定的。区别在于,异步函数将所有内容封装在另一个承诺中。这意味着在
console.log(5)
任务可以执行之前,微任务队列将获得一次额外的运行,从而使其在以后运行一次。作为测试,尝试
const data=wait new Promise(res=>res(new Promise(res=>res())。然后(()=>{console.log(2)}))