JS Promise异步调用为何会阻塞主线程?
js promise 同步调用为何阻塞?
对于问题中呈现的代码:
async function yyy() { console.log('yyy调用xxx开始') let res = await xxx() console.log('yyy调用xxx结束', res) } async function xxx() { return new promise(function(resolve, reject) { }) }
当 xxx 返回的 promise 没有被解析或拒绝时,会出现以下情况:
node.js 环境:
事件循环会检测到没有挂起的任务或微任务,并认为程序已完成,从而退出进程。然而,yyy 函数仍保持挂起状态。
浏览器环境:
await 会持续等待 promise 完成。如果浏览器在执行脚本过程中,可能会将此脚本视为已完成,并继续页面加载或交互。然而,如果脚本是独立执行的,yyy 函数将继续阻塞,直到 promise 得到解析或拒绝。即使用户可以与页面交互,脚本的其余部分也不会执行。
为了更直观地理解阻塞行为,可以调整代码如下:
async function yyy() { console.log('yyy调用xxx开始') let res = await xxx() console.log('yyy调用xxx结束', res) } async function xxx() { return new Promise(function(resolve, reject) { while(true) { console.log('xxx running ...'); } }) } yyy();
在这种情况下,yyy 函数将持续阻塞,而 xxx 函数将在后台无限运行。
以上就是JS Promise异步调用为何会阻塞主线程?的详细内容,更多请关注硕下网其它相关文章!