登录
首页 >  文章 >  前端

JS Promise异步调用为何会阻塞主线程?

时间:2024-11-26 14:49:06 371浏览 收藏

怎么入门文章编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《JS Promise异步调用为何会阻塞主线程?》,涉及到,有需要的可以收藏一下

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异步调用为何会阻塞主线程?》的详细内容,更多关于的资料请关注golang学习网公众号!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>