关于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 中没有调用 resolve,也没有调用 reject,那么 yyy 函数运行到 await xxx () 是结束运行还是在一直阻塞?
并没有执行console.log('yyy调用xxx结束', res),请问程序是自动结束了还是阻塞中?
首先分环境说这个问题
Node
下返回的
Promise
没有被resolve
或reject
,导致它永远处于pending
状态。但是,由于没有其他活动的异步操作(例如定时器、网络请求等),Node.js 的事件循环会发现没有任何待处理的任务或微任务,因此它会认为程序已经完成并退出。Node.js
的事件循环会持续运行,直到所有的异步操作都完成并且没有更多的回调函数需要执行。如果一个Promise
保持pending
状态,而没有其他活跃的操作,那么事件循环将不会等待这个Promise
完成,而是直接结束进程。await
将会一直等待这个Promise
完成。由于没有其他活动的异步操作来保持事件循环忙碌,浏览器环境中的JavaScript
引擎可能会认为脚本已经执行完毕,并且如果这是页面加载过程中的一部分,它可能不会阻止整个页面的渲染或交互。然而,如果你在一个独立的脚本中(比如直接在
<script>
标签内或者通过控制台输入),并且这个脚本是同步执行的,那么一旦执行到await xxx()
并且xxx
返回的Promise
没有被resolve
或reject
, 浏览器将不会继续执行后面的代码。但是,这并不意味着浏览器会完全阻塞。用户仍然可以与页面进行交互,只是你的脚本的剩余部分不会被执行。把你的代码换成
你将看到
yyy
持续的阻塞,xxx
在后台运行