我在Node中有一个JS异步函数。比如说,它从URL下载一个文件,并对它做一些事情,比如解压缩。我这样写它,它工作正常,但是eslint
让我感觉到有一股浓厚的代码味道:error Promise executor functions should not be async no-async-promise-executor
. Async
是必需的,因为await fetch
在身体功能中。
我对streams
和async/await
都不够熟练,无法自己纠正它。我想摆脱Promise,完全使用async/await
。模块stream/promises
似乎是从Node-15开始的方法,正如这里所评论的how-to-use-es 8-async-wait-with-streams。如何在这种情况下使用await pipeline(...)
?也许有更好更短的方法?
函数如下:
function doSomething(url) {
return new Promise(async (resolve, reject) => {
try {
const fileWriteStream = fs.createWriteStream(someFile, {
autoClose: true,
flags: 'w',
});
const res = await fetch(url);
const body = res.body;
body
.pipe(fileWriteStream)
.on('error', (err) => {
reject(err);
})
.on('finish', async () => {
await doWhatever();
resolve('DONE');
});
} catch (err) {
reject(err);
}
});
}
3条答案
按热度按时间ybzsozfc1#
您可以在进入执行器之前简单地执行
await
:一般来说,我的建议是从承诺执行者中删除尽可能多的代码。在这种情况下,承诺只是捕获解决/拒绝所必需的。
请注意,我还从
doSomething
中删除了doWhatever
-这使doSomething
更加健壮。最后,我建议您将
someFile
设置为doSomething
的参数,而不是从更广泛的上下文引用它!lb3vh1jj2#
要使用您正在寻找的
pipeline
函数,它应该是dkqlctbz3#
您可以在NodeJS中使用
fs/promises
并将代码精简为以下内容: