Функция Promisfy с событиями

#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')
}