#javascript #node.js #promise
#javascript #node.js #обещание
Вопрос:
Это обещанная функция spawn:
async function aspawn(cmd, args){
return new Promise((resolve, reject) => {
const proc = spawn(cmd, args);
proc.stderr.on('data', data => {
console.error('err', data.toString());
});
proc.stdout.on('data', data => {
console.error('stdout', data.toString());
});
proc.on('close', code => {
console.error('closed with code', code);
resolve();
});
});
}
Мне было интересно, возможно ли сделать это с меньшим отступом
Комментарии:
1. Есть ли у вас ограничение версии узла? Вас интересует
data
результат?2. Я могу использовать последнюю версию node. И я хочу получить всю информацию из всех событий
Ответ №1:
Используя асинхронный итератор и once
функцию источника событий, вы могли бы написать их следующим образом:
const { spawn } = require('child_process')
const { once } = require('events')
aspawn1('cat', ['README.md'])
.then(() => aspawn1('cat', ['FOO.md'])) // error stream
.then(() => aspawn2('cat', ['README.md']))
async function aspawn1 (cmd, args) {
try {
const proc = spawn(cmd, args)
// in any case you can add events to `proc`
// consume the stream
for await (const chunk of proc.stdout) {
console.log('>>> ' chunk.length)
}
for await (const chunk of proc.stderr) {
console.log('err >>> ' chunk.length)
}
// the stream is ended and the spawn aswell
} catch (err) {
// if you need to retrun always a positive promise
console.log('error happened', err)
}
}
// Since node: v11.13.0, v10.16.0 you may write that function like this to have a strict "fire and forget" spawn:
function aspawn2 (cmd, args) {
return once(spawn(cmd, args), 'close')
}