gpt4 book ai didi

Javascript:WAITING已解决的 promise

转载 作者:行者123 更新时间:2023-12-04 13:11:49 24 4
gpt4 key购买 nike

我想知道,如果等待已解决的 promise ,将导致同步代码执行或可能导致异步执行。
我做了这个小片段来检查浏览器:

const promise = new Promise((resolve) => {
console.log('exec promise');
setTimeout(() => {
console.log('executed promise');
resolve();
}, 1000);
});

(async () => {
console.log('start');
for (let i = 0; i < 1e8; i += 1) {
await promise;
}
console.log('end');
})();
看起来浏览器使它同步(考虑到屏幕卡住)。
但是...是由于浏览器特定的实现吗?还是设计使然?

最佳答案

这是一个不会卡住浏览器的替代演示(我认为这是我们试图展示的方式),它显示了与您最初的结论相反的行为:

const p = new Promise((r) => r());

p.then(() => {

(async() => {
console.log('a');
await p;
console.log('p');
})()
console.log('b');

});

在这种情况下,我们得到 p ,一个已解决的 promise 。然后我们启动一个等待它的异步函数。输出是:

a
b
p


IE 当它到达 b 时,异步函数仍然返回控制(并且 await 被记录)关于已经解决的 p .仅在 b 之后被记录并且事件循环在 await 之后可以自由返回执行。是 p随后登录。
这是标准行为吗?是的。
specification有效地将等待的表达式转换为 then promise 的一部分,在 subsequent step 的步骤 9 和 10 中决定如何进行。
  1. If promise.[[PromiseState]] is pending, then
    a. Append fulfillReaction as the last element of the List that is promise.[[PromiseFulfillReactions]].
    b. Append rejectReaction as the last element of the List that is promise.[PromiseRejectReactions]].
  2. Else if promise.[[PromiseState]] is fulfilled,
    a. then Let value be promise.[[PromiseResult]].
    b. Let fulfillJob be NewPromiseReactionJob(fulfillReaction, value)
    c. Perform HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]]).

第 9 步说如果它是未决的,添加生成的 then到履行 promise 时要调用的事物列表。
第 10 步触及您问题的核心——它说如果它已经完成,则将工作排入队列——即将它放在要回调的事物队列中。
规范有效地表明 await永远不应该同步返回。

关于Javascript:WAITING已解决的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64367903/

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