是否等待当前迭代完成,然后再进行下一个迭代?

给定一个像这样的循环:

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

在哪里readFileLineByLine返回AsyncGenerator,它将在await processLine返回之前或之后开始处理第二行吗?(假设第二行在processLine完成之前已准备就绪

如果没有,那么如何并行化呢?(以便可以同时处理许多行)

乔治

您的for await循环是以下方面的语法糖:

let generator = readFileLineByLine();

while (true) {
    let promise = generator.next();
    let item = await promise;

    if (item.done)
        break;

    let line = item.value;
    await processLine(line)

}

因此,答案是肯定的,readLine(nextLine)直到processLine(previousLine)完成才开始

如果您希望两个函数不相互依赖,则一种选择是使readFileLineByLine非异步,即只是yield待定的承诺。正常使用此生成器,附加then(processLine)到每个诺言,然后等待它们:

let promises = [];

for (let promise of readFileLineByLinePending())
    promises.push(promise.then(processLine))

await Promise.all(promises)

这是一个演示:

async function delay(n) {
    return new Promise(res => setTimeout(res, n))
}


async function processLine(s) {
    console.log('process BEGIN:', s)
    await delay(300);
    console.log('process END:', s)
}

async function* readFileLineByLine() {
    for (let i = 0; i < 6; i++) {
        console.log('read BEGIN', i)
        await delay(500);
        let t = await 'line' + i;
        console.log('read END', i)
        yield t;

    }
}

function* readFileLineByLinePending() {
    for (let i = 0; i < 6; i++) {
        console.log('readPending BEGIN', i)
        let t = delay(500).then(() => {
            console.log('readPending END', i);
            return 'line' + i;
        });
        yield t;

    }
}


async function main() {

    console.time('async gen')

    for await(let line of readFileLineByLine())
       await processLine(line)

    console.log('----------------------------------------')
    console.timeEnd('async gen')
    console.log('----------------------------------------')


    console.time('sync gen')

    let promises = [];

    for (let promise of readFileLineByLinePending())
        promises.push(promise.then(processLine))

    await Promise.all(promises)

    console.log('----------------------------------------')
    console.timeEnd('sync gen')
    console.log('----------------------------------------')
}

main().then(() => console.log('done'))
.as-console-wrapper {max-height:100% !important; top:0;}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

等待文件上传,然后再进行下一个循环迭代?

如何使用等待 jquery ajax 完成的 javascript 承诺,然后再进行下一个承诺?

等待循环中的异步功能完成执行,然后再进行下一次迭代

如何传送Jmeter以等待线程组中的所有采样器完成,然后再进行下一个循环

仅在完成当前迭代之后才计算经过的时间,然后再进行新的迭代

等待内联线程完成,然后再转到下一个方法

等待请求完成,然后再执行下一个操作

等待循环完成,然后再执行下一个功能

JavaFX等待动画方法完成,然后再转到下一个方法

AzureDevops 代理必须先完成当前构建,然后再进行另一个构建

如何在一个循环内进行HTTP调用并等待一个完成,然后再进行另一个调用?

在 nodejs 中开始下一个循环之前,等待每个 for 循环迭代完成

如何阻止Bash进入下一个循环迭代,直到当前进程完成?

在“ for”循环中使用Jquery promise()等待效果完成,然后再开始下一个效果

等待下载方法完成,然后再运行下一个.then-node.js

等待功能中的所有淡入完成,然后再启动下一个功能

等待循环中的每个动画完成,然后再运行下一个动画

如何使循环等待db promise完成,然后再继续下一次迭代?

迭代循环,将当前索引与下一个索引进行比较

Makefile:执行子目标中的所有语句,然后再进入下一个子目标

如何进行下一个迭代

如何遍历URL数组并等待响应,然后再转到下一个

Android / Java-等待AsyncTask结束,然后再执行下一个功能

Qt Websocket发送消息并等待响应,然后再转到下一个方法

获取当前迭代中每个函数的下一个迭代值 Jquery

Python中有没有一种方法可以创建一个for循环,而该循环不会等待内部代码完成再进行迭代?

等待其他会话中的多个同时Powershell命令完成,然后再运行下一个命令

将所有浮点值与整数进行比较,然后跳到循环的下一个迭代

如何使用Java流在每次迭代中使用当前对象和下一个对象对列表进行分区?