gpt4 book ai didi

javascript - 在执行之前,异步 promise 存储在 JavaScript 中的什么位置?

转载 作者:行者123 更新时间:2023-11-30 19:56:40 24 4
gpt4 key购买 nike

我已经使用 JavaScript 几年了,最近对高级 JavaScript 概念进行了大量研究。我了解到函数回调存储在通常称为事件队列或消息队列的队列中,这就是允许 JavaScript 异步操作的原因。

我从许多来源了解到, promise 在事件队列的回调之前执行。我个人的实验也证实了这种行为。然而,两者似乎都被推到了同一个队列。如果 promise 与所有其他回调共享同一队列,它们将如何首先执行?

从逻辑上讲,我假设 promises 被推送到一个优先级高于事件队列中回调的不同队列,但我找不到任何来源来支持这一点。

我了解所有浏览器处理事件队列的方式不同,并且不同的环境会观察到不同的行为。但是我一定遗漏了一些东西。

最佳答案

这是实现定义的。 ECMAScript (JavaScript) 规范只要求 then 回调(和等待)的作业(EnqueueJob)在同步 JavaScript 代码之后按顺序执行。

在它之外发生的一切(“事件循环”在 Node 或浏览器 DOM API 中带有 I/O 回调)都由平台控制。

即: - Promise 回调调度是 JavaScript 和 ECMAScript 规范的一部分。 - 其他 I/O(例如计时器、文件访问、DOM 用户交互事件、网络访问)由主机平台而非 JavaScript 确定。这可以是 Node.js 或浏览器 DOM API。

是一个队列还是两个队列由实现定义。

我将选择一种实现方式 (Node.js)。在 Node.js(和 Chrome)中,它们存储在两个不同的队列中。

Promise 回调是通过 V8 的 Isolate(执行环境)的 RunMicrotasks 方法“运行”的。这发生在 next_tick.js :

function runNextTicks() {
if (tickInfo[kHasScheduled] === 0 && tickInfo[kHasPromiseRejections] === 0)
runMicrotasks();
if (tickInfo[kHasScheduled] === 0 && tickInfo[kHasPromiseRejections] === 0)
return;

internalTickCallback();
}

这会调用 V8 的微任务队列。另一方面,回调通过 libuv 在 node.cc 中运行。 .

有两个队列(libuv 和 V8),V8(微任务队列)有机会在 libuv 的每两个项目之间运行。

关于javascript - 在执行之前,异步 promise 存储在 JavaScript 中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53918190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com