【发布时间】:2020-02-22 12:04:25
【问题描述】:
所以我有这段代码,我正在尝试全面了解 async/await 语法。下面是Promise版本的代码:
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/await 方式编写它(实际上有效):
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... 循环的情况下使用 async/await 方式编写此代码?
除了使用.then 语法之外,我也不知道如何访问数据:
callToolsAsync(['GET','mailuser'])
.then(console.log)
我还能如何访问来自resolve(data) 的“数据”?
非常感谢。
【问题讨论】:
-
仅在
exit事件之后等待stdout/stderr上的数据似乎是一个非常糟糕的主意
标签: javascript node.js asynchronous child-process