gpt4 book ai didi

javascript - 如何将 Promise.race 或 Promise.all 与异步迭代一起使用?

转载 作者:行者123 更新时间:2023-12-01 00:10:20 25 4
gpt4 key购买 nike

代码示例应该比文字更好地解释:

const spawn = require('child_process').spawn;

const start = new Date();
(async()=>{
const proc = spawn('( echo a; >&2 echo b; sleep 1; echo c; >&2 echo d )', { shell:true });
proc.stdout.setEncoding('utf8');
proc.stderr.setEncoding('utf8');
for await (const data of proc.stdout) {
console.log(new Date() - start, "proc stdout:", data);
}
for await (const data of proc.stderr) {
console.log(new Date() - start, "proc stderr:", data);
}
})();

这里的输出看到 stderr 最后出现,这对于许多用例来说都很好,但我很好奇如何从两个流中获取未延迟的输出。例如,观察到的行为是:

5 'proc stdout:' 'a\n'
1006 'proc stdout:' 'c\n'
1009 'proc stderr:' 'b\nd\n'

这是有道理的,因为在 stdout 完全消耗之前,异步流执行不会到达第二个 for 循环。

我想象 Promise.all 或 race 可以用来构造一种方法来实现我想要的,但它并没有在我面前实现。另外, for wait 循环是干净地访问异步可迭代的唯一方法吗?

最佳答案

将每个 forawait 放入异步 IIFE 中,这样您就可以从每个 forawait 中获得一个 Promise。然后你可以对它们调用 Promise.allPromise.race :

proc.stdout.setEncoding('utf8');
proc.stderr.setEncoding('utf8');
const stdoutProm = (async () => {
for await (const data of proc.stdout) {
console.log(new Date() - start, "proc stdout:", data);
}
})();
const stderrProm = (async () => {
for await (const data of proc.stderr) {
console.log(new Date() - start, "proc stderr:", data);
}
})();
await Promise.race([stdoutProm, stderrProm]);
// One of the iterators has been completely consumed

关于javascript - 如何将 Promise.race 或 Promise.all 与异步迭代一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60121760/

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