循环中的Javascript异步函数
我用异步函数download_file()编写了以下代码,它仅在作为单个函数运行的情况下才能正常工作,但在循环中,它不会等待迭代结束。循环中的Javascript异步函数,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我用异步函数download_file()编写了以下代码,它仅在作为单个函数运行的情况下才能正常工作,但在循环中,它不会等待迭代结束。 我假设您希望每次迭代都等待download\u file函数结束,如果是这样,则您的download\u file函数应返回一个Promise函数,该函数在您完成下载并按照代码编写内容时会得到解决,目前它没有返回任何内容,因此在它不执行任何操作之前等待。我假设您希望每次迭代都等待下载\u文件函数结束,如果是这样,则您的download\u文件函数应返回一个Pr
我假设您希望每次迭代都等待
download\u file
函数结束,如果是这样,则您的download\u file
函数应返回一个Promise
函数,该函数在您完成下载并按照代码编写内容时会得到解决,目前它没有返回任何内容,因此在它不执行任何操作之前等待。我假设您希望每次迭代都等待下载\u文件
函数结束,如果是这样,则您的download\u文件
函数应返回一个Promise
,每当您完成下载并按照代码编写内容时,该问题就会得到解决,目前它没有返回任何内容,因此等待
之前它不会做任何事情。只需添加等待
即可让节点等待结果
await (async () => {
for (let year of years) {
for (let month of months) {
for (let r of day_rng) {
await download_file(year, month, r);
}
}
}
})();
只需添加wait
即可让节点等待结果
await (async () => {
for (let year of years) {
for (let month of months) {
for (let r of day_rng) {
await download_file(year, month, r);
}
}
}
})();
看起来应该有用。如何调用它?您应该使用await
关键字调用它。噢,它正在被立即调用。尝试添加await(async()=>{
。并非所有版本的节点都支持顶级的await
,因此您可能需要进行一些重构。看起来它应该可以工作。如何调用它?您应该使用await
关键字调用它。哦,正在立即调用它。请尝试添加await(async()=>{
。并非所有版本的节点都支持在顶层等待
,因此您可能需要进行一些重构。如何做出这样的承诺?类似这样:返回新承诺((解析,拒绝)=>{//您的代码在这里……////如果需要,您可以传递任何您想要解析或拒绝的数据////当一切都完成并且成功解析()///如果错误拒绝()})
它已经返回了一个承诺,因为它是async
。只需将async
添加到函数中,它就会返回一个承诺(即使是没有价值的承诺)@user2740650嗯,没错,我没有看到他也将download\u file
函数定义为异步函数,但是如果他在自调用函数之前添加了一个wait
,该函数将使节点等待所有下载完成,对吗?如果有意义的话,不要等待每一个。因此我的回答是只添加wait
如果他想让它等待:)。如果我的解释正确,应该是一个单词的修复。只是它调用了自调用函数,但没有等到返回的承诺被解析后再运行脚本的其余部分(该脚本将刚刚退出)。如何做出这样的承诺?类似这样:返回新承诺((解析,拒绝)=>{//您的代码在这里……////如果需要,您可以传递任何您想要解析或拒绝的数据////当一切都完成并且成功解析()///如果错误拒绝()})
它已经返回了一个承诺,因为它是async
。只需将async
添加到函数中,它就会返回一个承诺(即使是没有价值的承诺)@user2740650嗯,没错,我没有看到他也将download\u file
函数定义为异步函数,但是如果他在自调用函数之前添加了一个wait
,该函数将使节点等待所有下载完成,对吗?如果有意义的话,不要等待每一个。因此我的回答是只添加wait
如果他想让它等待:)。如果我的解释正确,应该是一个单词的修复。只是它调用了自调用函数,但没有等到返回的承诺得到解决,然后再运行脚本的其余部分(这将刚刚退出)。看起来您至少需要节点版本14.3,根据。看起来您至少需要节点版本14.3。