我正在尝试生成一个子进程并将其结果保存在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[]
答案 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));
}
});
});
}
中,我们检查是否有当前命令。在解决或拒绝当前命令后,将启动新命令。