Пример кода должен объяснить лучше, чем могут слова:
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'
Это имеет смысл, потому что выполнение асинхронного c потока не достигает секунды за l oop до тех пор, пока stdout не будет полностью использован.
Я представляю, что Promise.all или расу можно использовать для создания способа достижения того, чего я хочу, но это не материализуется передо мной. Кроме того, являются ли циклы ожидания единственным способом доступа к асинхронным итерациям c без ошибок?