返回顺序运行子进程的promise

时间:2017-02-17 09:09:37

标签: javascript node.js typescript promise spawn

我正在尝试生成一个子进程并将其结果保存在Promise中。 子进程不能同时运行多次。

我在一个Promise中包装node.js的child_process.spawn()。 承诺在流程退出成功时履行,否则拒绝承诺。 在不同时间请求com有时一次有多次。我需要为每个请求执行相同的命令,甚至可能多次(使用不同或可能相同的选项)来完成请求。但是如果并行运行,命令将锁定。因此,如果事先没有确定退出,就无法运行。

也许我需要他们排队?

我无法理解如何在JavaScript / Typescript中执行此操作。忙碌的等待显然不是上帝的想法,但我希望它能解释我想在这里做什么。

export class RunThingy{

private busy: boolean;

constructor() {
  this.busy = false;
}

private run(options: string[]): Promise<string> {
  return new Promise((resolve, reject) => {
    let stdout: string = '';
    let stderr: string = '';
    while (!this.busy) {             //Problem
      this.busy = true;
      let process: ChildProcess = spawn('processName', options); 
      process.stdout.on('data', (contents) => { stdout += contents; });
      process.stderr.on('data', (contents) => { stderr += contents; });
      process
        .on('error', reject)
        .on('close', function (code) {
          if (code === 0) {
            resolve(stdout);
          } else {
            reject(stderr);
          }
          this.buisy = false;        //Problem
        });
    }
  });
}

修改:将command[]重命名为options[]

1 个答案:

答案 0 :(得分:1)

承诺可以拒绝或解决一次。每个过程都必须包含在承诺中。这是一个命题:

settings.py

在方法export class RunThingy { private curCommand: Promise<string> | null private run(options: string[]): Promise<string> { let next: Promise<string> if (this.curCommand) { next = this.curCommand.then( () => runCommand(options), // the next command will be started after () => runCommand(options) // the current will be resolved or rejected ) } else next = runCommand(options) next = next.then(stdout => { if (next === this.curCommand) // if this is the last command this.curCommand = null // then forget the current command return stdout // return the command value }, err => { if (next === this.curCommand) // if this is the last command this.curCommand = null // then forget the current command throw err // throw again the error }) this.curCommand = next return this.curCommand } } function runCommand(options: string[]): Promise<string> { return new Promise((resolve, reject) => { let stdout = ''; let stderr = ''; let process: ChildProcess = spawn('processName', options); process.stdout.on('data', (contents) => { stdout += contents; }); process.stderr.on('data', (contents) => { stderr += contents; }); process .on('error', reject) .on('close', function (code) { if (code === 0) { resolve(stdout); } else { reject(new Error(stderr)); } }); }); } 中,我们检查是否有当前命令。在解决或拒绝当前命令后,将启动新命令。