因此,这是基于我在开发用于简化异步生成器或迭代器的程序包时所做的发现。
通常,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程序中可以做些什么来保证此顺序?