gpt4 book ai didi

javascript - 返回顺序运行的子进程的 promise

转载 作者:行者123 更新时间:2023-12-03 04:59:14 25 4
gpt4 key购买 nike

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

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

也许我需要他们排队?

我无法理解如何在 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[]

最佳答案

promise 可以被拒绝或解决一次。每个过程都必须包含在一个 promise 中。这里有一个建议:

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

在方法run中,我们检查是否存在当前命令。当前命令解决或拒绝后,将启动新命令。

关于javascript - 返回顺序运行的子进程的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42293731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com