javascript - 简化 Node V8 childprocess.exec

标签 javascript node.js promise async-await

我有一个非常干净简单的方法来使用 Node V8 Promisfy() 和异步函数执行“await runJob()”。我遇到的问题是我需要一个由 childProcess.execFile() 返回的子对象的句柄。所以现在我有一个非常困惑的解决方案,但我显然对此不满意。关于如何清理它有什么想法吗?

之前:

const invoke = util.promisify(childProcess.execFile)

async runJob() {
    try {
        const std = await invoke(this.FMEPath, ["PARAMETER_FILE", this.fmeParamFile], { cwd: this.root })
        this.stderr = std.stderr
        this.stdout = std.stdout
    } catch (err) {
        this.errors++
        logger.addLog('error', "FMEjob.runJob - childProcess.execFile failed: %s", err.message, { paramFile: this.fmeParamFile, error: err })
    }
}

之后:

 async runJob() {
    return new Promise((resolve, reject) => {
        this.child = execFile(this.FMEPath,
            ["PARAMETER_FILE", this.fmeParamFile],
            { cwd: this.root },
            (err, stdout) => {
                if (err) {
                    this.errors++
                    logger.addLog('error', "FMEjob.runJob - childProcess.execFile failed: %s", err.message, { paramFile: this.fmeParamFile, error: err })
                    return reject(false)
                } else {
                    this.stderr = stderr
                    this.stdout = stdout
                    resolve(true)
                }
            })
    })
}

最佳答案

仅将 resolve/reject 放入回调中,不添加任何其他内容:

async runJob() {
    try {
        const std = await new Promise((resolve, reject) => {
            this.child = execFile(this.FMEPath, ["PARAMETER_FILE", this.fmeParamFile], { cwd: this.root }, (err, std) => {
                if (err) reject(err);
                else resolve(std);
            });
        });
        this.stderr = std.stderr
        this.stdout = std.stdout
        return true;
    } catch (err) {
        this.errors++
        logger.addLog('error', "FMEjob.runJob - childProcess.execFile failed: %s", err.message, { paramFile: this.fmeParamFile, error: err })
        throw false;
    }
}

关于javascript - 简化 Node V8 childprocess.exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44707268/

相关文章:

node.js - 负载均衡 Amazon EC2 上的 Node socket.io

node.js - 在 AWS 上运行的 NodeJS 应用程序的 Mongoose CastError

node.js - Mongoose promise 和 sonarqube

Javascript、Promises 和 setTimeout

javascript - jQuery promise 一切

javascript - 共享 JavaScript AMD 模块时如何选择依赖项名称?

javascript - 使用 Google Analytics 跟踪 Wordpress 后端生成的 PDF

javascript - 我如何解析这个包含\n的变量?

javascript - javascript点击事件的问题

javascript - Hapi.js 自定义 404 错误页面