【发布时间】:2020-04-03 10:40:30
【问题描述】:
所以这是基于我在开发一个包以简化异步生成器或迭代器时发现的。
通常情况下,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();
我不确定“执行/解决顺序”是否是正确的术语,但这个顺序是否得到保证?有什么办法可以在 Node 或 Browser 程序中保证这个顺序?
【问题讨论】:
-
你确定他们是发电机吗?在我看来,它们不像发电机?这些不是异步迭代器吗?
-
我宁愿将第一个示例的“固定顺序”视为实现细节。我不是 100% 确定,但我认为规范不能保证任何类型。
-
@InchHigh 你说得对,更新了问题以反映变化。
-
@Amadan 这就是我的怀疑,但一直找不到任何来源(主要是因为我不确定它的实际名称)并且也无法产生不同的结果。
-
@Amadan spec 确实提到应该保留执行顺序。
标签: javascript typescript asynchronous async-await es6-promise