gpt4 book ai didi

javascript - for-await-of 是否等待当前迭代完成后再进行下一次迭代?

转载 作者:行者123 更新时间:2023-12-03 16:32:48 25 4
gpt4 key购买 nike

给定一个循环:

for await(let line of readFileLineByLine('./long-file.txt')) {
const interestingFacts = await processLine(line);
}

readFileLineByLine 返回一个 AsyncGenerator,这会在 await processLine 返回之前或之后开始处理第二行吗? (假设第二行在 processLine 完成之前准备就绪)

如果不是,如何将其并行化? (这样可以同时处理很多行)

最佳答案

下一次迭代只会在上一次迭代完成后开始。这可以通过 for 循环中的 awaiting 轻松显示:

const asyncIterable = {
[Symbol.asyncIterator]() {
return {
i: 0,
next() {
if (this.i < 3) {
return Promise.resolve({ value: this.i++, done: false });
}

return Promise.resolve({ done: true });
}
};
}
};

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

(async function() {
for await (let num of asyncIterable) {
console.log('start ' + num);
await delay(1000);
console.log('end ' + num);
}
})();

要并行化,您可以调用函数(但不要等待它解析)并将(新)Promise 推送到数组,然后在数组上调用 Promise.all:

const asyncIterable = {
[Symbol.asyncIterator]() {
return {
i: 0,
next() {
if (this.i < 3) {
return Promise.resolve({ value: this.i++, done: false });
}

return Promise.resolve({ done: true });
}
};
}
};

const processNum = num => new Promise(resolve => setTimeout(resolve, 1000));

(async function() {
console.log('start');
const proms = [];
for await (let num of asyncIterable) {
proms.push(processNum(num));
}
await Promise.all(proms);
console.log('all done (1000ms)');
})();

(因为事先不知道可迭代对象返回的项目数量,所以像 .map 这样看起来更干净的东西是不可能的,不幸的是)

关于javascript - for-await-of 是否等待当前迭代完成后再进行下一次迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57919245/

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