web-dev-qa-db-ja.com

Child_process.spawnの「Promise」構文を「async / await」構文に変換する方法

だから私はこのコードを持っており、非同期/待機の構文を完全に理解しようとしています。以下は 約束する コードのバージョン:

_function callToolsPromise(req) {
    return new Promise((resolve, reject) => {
        let pipshell = 'pipenv';
        let args = ['run', 'tools'];
        req.forEach(arg => {
            args.Push(arg)
        });
        tool = spawn(pipshell, args);
        tool.on('exit', (code) => {
            if (code !== 0) {
                tool.stderr.on('data', (data) => {
                    reject(data);
                });
            } else {
                tool.stdout.on ('data', (data) => {
                    resolve(JSON.parse(data)):
                });
            }
        });
    })
}
_

python tools/__ main__.pyで実行したいコードがあるので、これが "pipenv"を呼び出す理由です。

ここにそれを書く私の試みがあります 非同期/待機 方法(実際に機能します):

_async function callToolsAsync(req) {
    let pipshell = 'pipenv';
    let args = ['run', 'tools'];
    req.forEach(arg => {
        args.Push(arg)
    });
    let tool = spawn(pipshell, args);
    for await (const data of tool.stdout) {
        return data
    }
}
_

しかし、私がしたのは、_for await..._ループがある誰かの例からコピーして貼り付けることだけでした。

したがって、私は実際にそれを理解できるように、同じコードを書き直そうとしてきましたが、今では何日も失敗しています。

他の方法でこのコードを書く方法はありますか 非同期/待機 _for await..._ループを使用しない方法?

また、_.then_構文を使用する以外は、データにアクセスする方法がわかりません。

_callToolsAsync(['GET','mailuser'])
.then(console.log)
_

他にどのようにしてresolve(data)から「データ」にアクセスしますか?

どうもありがとう。

2
tinnick

await-spawnを使用してこの問題を解決しました

https://www.npmjs.com/package/await-spawn

child_process.spawn() wrapped in a Promise for doing async/await.
0
Yidir