简化节点V8 childprocess.exec

时间:2017-06-22 18:51:40

标签: 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)
                }
            })
    })
}

1 个答案:

答案 0 :(得分:3)

只将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;
    }
}