Node JS с node-cmd: дождаться завершения предыдущего вызова cmd - PullRequest
0 голосов
/ 21 января 2020

У меня есть серия python скриптов, которые я хочу вызвать через node-cmd в моем Node JS приложении. Они полагаются друг на друга, поэтому я не могу выполнять их параллельно. Я также не могу использовать фиксированное время ожидания, так как они всегда имеют разное время выполнения. Прямо сейчас, при вызове моего кода, все сценарии вызываются одновременно, и поэтому возникает ошибка ... см. Мой код:

pythoncaller: function(req, callback) {

var cmd=require('node-cmd');

cmd.get(`python3 first.py`,
    function(err, data, stderr){
      console.log(err);
      console.log(stderr);
      console.log(data);
});
cmd.get(`python3 second.py`,
    function(err, data, stderr){
      console.log(err);
      console.log(stderr);
      console.log(data);
});

cmd.get(`python3 third.py"`,
    function(err, data, stderr){
      console.log(err);
      console.log(stderr);
      console.log(data);

});
cmd.get(`python3 last.py"`,
    function(err, data, stderr){
      console.log(err);
      console.log(stderr);
      console.log(data);
      callback(data);
});
},

Знаете ли вы решение о том, как выполнять эти сценарии не параллельно

Ответы [ 2 ]

1 голос
/ 21 января 2020

Вы можете обещать функции стиля обратного вызова и использовать .then, чтобы выполнять их одну за другой. что-то вроде этого

const cmd = require('node-cmd');
const Promise = require("bluebird");
const getAsync = Promise.promisify(cmd.get, { multiArgs: true, context: cmd });

var cmd = require('node-cmd');

getAsync(`python3 first.py`)
  .then(data => console.log(data))
  .then(() => getAsync(`python3 second.py`)
  .then(data => console.log(data))
  .then(() => getAsync(`python3 third.py"`)
  .then(data => console.log(data))
  .then(() => getAsync(`python3 last.py"`)
  .then(data => console.log(data));

Это также упоминается в node-cmd readme. Смотрите здесь - https://www.npmjs.com/package/node-cmd#with - обещания

0 голосов
/ 21 января 2020

Согласно do c, вы можете обещать cmd.get.

Альтернатива .then с await ниже

// copy pasted
// either Promise = require('bluebird') or use (require('util').promisify)
const getAsync = Promise.promisify(cmd.get, { multiArgs: true, context: cmd })

pythoncaller: async function(req, callback) {
  try {
    let data
    data = await getAsync(`python3 first.py`)
    data = await getAsync(`python3 second.py`)
    data = await getAsync(`python3 third.py"`)
    // ...
  } catch (e) {
    return callback(e)
  }
  return callback()
}
...