【问题标题】:Simplify node V8 childprocess.exec简化节点 V8 childprocess.exec
【发布时间】:2017-06-23 03:13:33
【问题描述】:

我有一个非常简洁的方法来使用 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)
                }
            })
    })
}

【问题讨论】:

    标签: javascript node.js promise async-await


    【解决方案1】:

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

    【讨论】:

    • 调用 const running = await this.runJob() 不会立即获得 true 值。我的方式是 runJob() 返回一个承诺。这改变了这一点。
    • 不,runJob - async 函数 - 仍然返回一个承诺。这就是为什么你必须await 并且稍后会得到true
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多