lvi*_*ani 4 node.js async-await
请考虑这段代码:
var cmd = `cd "${dir}" && curl -L "${url}" | tar -xJvf - | zip -qr archive.zip -@`;
await exec(cmd);
res.sendFile(path.join(dir, "archive.zip"));
Run Code Online (Sandbox Code Playgroud)
它下载一个 .tar.xz,解压并重新压缩,最后发送给用户。
如果我运行它,它不会res.sendFile(...)说该文件不存在。但是,如果我查看我的文件系统,zip 文件实际上就在那里。
所以我尝试在之前添加一个小的延迟res.sendFile(...),如下所示:
var cmd = `cd "${dir}" && curl -L "${url}" | tar -xJvf - | zip -qr archive.zip -@`;
await exec(cmd);
setTimeout(()=>{
res.contentType(path.join(dir, "archive.zip"));
res.sendFile(path.join(dir, "archive.zip"));
}, 1000);
Run Code Online (Sandbox Code Playgroud)
...它神奇地起作用了。
似乎exec(cmd)实际上并没有等待命令完成。是因为它是管道吗?
那么 exec 并没有真正像那样工作。
await 关键字期望 Promise 等待。由于 exec 只会返回一个子进程对象并且需要调用回调然后准备好,这将不起作用。
但是 node 中有一个 util 可以将这些常规 node 函数转换为名为 util.promisify 的 promise 函数。nodejs.org/api/util.html#util_util_promisify_original
这也显示在 exec 的文档中(参见本段末尾的https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback)
let util = require('util')
let exec = require('child_process').exec
let exec_prom = util.promisify(exec)
exec_prom('ip address').then(()=>{console.log('done')})
async function do(){
await exec_prom('ip address');
// do something after
}Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1856 次 |
| 最近记录: |