gpt4 book ai didi

javascript - await 单个 Promise 与异步迭代器的异步解析顺序

转载 作者:行者123 更新时间:2023-12-04 10:54:57 26 4
gpt4 key购买 nike

所以这是基于我在开发一个包以简化异步生成器或迭代器时发现的。

通常情况下,promise 的执行顺序是由它被调用的时间决定的,这意味着以下是正确的(在 Windows 和 Mac 上的 Chrome 和 Node 中)。

let resolve, promise = new Promise(r => resolve = r);

(async () => {
await promise
console.log('1st')
})();
(async () => {
await promise
console.log('2nd')
})();

resolve();

但是,在处理异步生成器或迭代器时不遵守此顺序

let resolve, promise = new Promise(r => resolve = r);

async function* generator() {
yield promise
}

(async () => { // regular promise
await promise
console.log('1st')
})();
(async () => { // promise generator
for await (let _ of generator())
console.log('3rd (should be 2nd)')
})();
(async () => { // promise iterator
for await (let _ of [promise])
console.log('4th (should be 3rd)')
})();
(async () => { // regular promise again
await promise
console.log('2nd (should be 4th)')
})();

resolve();

我不确定“执行/解决顺序”是否是正确的术语,但这个顺序是否得到保证?有什么办法可以在节点或浏览器程序中保证这个顺序?

最佳答案

promise 解决顺序得到保证:

25.6.1.8 TriggerPromiseReactions ( reactions, argument )

[...]

  1. For each reaction in reactions, in original insertion order, do

    a. Perform EnqueueJob("PromiseJobs", PromiseReactionJob, << reaction, arguments >>)



要了解迭代器发生了什么,请查看以下代码段:

let resolve, promise = new Promise(r => resolve = r);

let chained = promise.then(it => Promise.resolve());

(async () => {
await chained;
console.log("2nd");
})();

(async () => { // regular promise
await promise
console.log('1st')
})();


resolve();


正如你所看到的,当另一个 Promise 解决时,一个 Promise 会得到解决,这需要两个微滴。

这就是异步迭代器中发生的事情。当您调用 .next ,一个 Promise 被返回并存储在迭代器内部队列中。同时,异步生成器函数的执行继续进行。然后当异步迭代器 yields (在你的情况下,在一个微滴之后),它解决了队列中的下一个 promise 。由于 promise 解决是另一个微任务,因此总共需要两个滴答声。
resolve();
// 1 microtick
await promise; // generators await yielded promises implicitly
yield;
// 1 microtick
for await(const _ of iterator)

关于javascript - await 单个 Promise 与异步迭代器的异步解析顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59263926/

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