Как использовать child_process.exec () узла с обещаниями - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь выполнить длинные процессы последовательно с помощью node.js (команды docker exec).

Я делаю:

const childProcess = require('child_process');

const execWithPromise = async command => {
    return new Promise(async resolve => {
        const process = childProcess.exec(command);

        process.on('exit', err => resolve(err));
        process.on('close', err => resolve(err));
    });
};

const run = async () => {
    await execWithPromise('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
    await execWithPromise('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
};

run();

Но обещание немедленно разрешается с результатом 1. В обоих случаях. Команда работает в командной строке очень хорошо.

Почему он возвращается немедленно?

1 Ответ

0 голосов
/ 14 мая 2018

child_process.exec ожидает обратного вызова в качестве второго или третьего аргумента.Это не возвращает обещание.У вас есть несколько вариантов в зависимости от вашего варианта использования и версии узла.

Воспользуйтесь обратным вызовом и верните разрешение.

return new Promise(async resolve => {
     childProcess.exec(command, (err, stout, sterr) {
        resolve(err ? stout : sterr)
      }
  });

Вместо этого используйте spawn (сохраняя большую часть кода)

const execWithPromise = async command => {
    return new Promise(async resolve => {
        const process = childProcess.spawn(command);
        process.on('data', data => resolve(data));
        process.on('error', err => reject(err));
        process.on('close', err => reject(err));
    });
};

Использование execSync с try catch

return new Promise(async resolve => {
    try {
        resolve(childProcess.execSync(command));
    } catch(error) {
      reject(error) 
    }
});
...