带有node-cmd的Node JS:等到之前的cmd调用执行完成后,

问题描述 投票:0回答:2

我想在Node JS应用程序中通过node-cmd调用一系列python脚本。它们彼此依赖,所以我不能并行执行它们。我也不能使用固定的等待时间,因为它们总是有不同的执行时间。现在,在调用我的代码时,所有脚本都被同时调用,因此会出错...请参见我的代码:

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);
});
},

您知道如何不并行执行那些脚本的解决方案吗?

javascript python node.js callback wait
2个回答
1
投票

您可以承诺回调样式函数,并使用.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自述文件中也提到过。看到这里-https://www.npmjs.com/package/node-cmd#with-promises


0
投票

根据文档,您可以承诺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()
}
© www.soinside.com 2019 - 2024. All rights reserved.