Javascript for循环中的异步函数等待循环完成,然后执行下一个操作

Javascript for循环中的异步函数等待循环完成,然后执行下一个操作,javascript,asynchronous,Javascript,Asynchronous,我正在尝试循环浏览Reddit链接列表,并逐一下载它们 我有一个异步函数,可以检索imgur相册图像并下载它们 async function getAlbum(sub,title,id,psub,auth) { let p = {} let alburls = [] let result = await getAlbumImages(id) let re = result.data.data.images for(v of re) { va

我正在尝试循环浏览Reddit链接列表,并逐一下载它们

我有一个异步函数,可以检索imgur相册图像并下载它们

async function getAlbum(sub,title,id,psub,auth) {

   let p = {}
   let alburls  = []
   let result = await   getAlbumImages(id)

   let re = result.data.data.images

   for(v of re)
   {
    var ext = v.link.split('.').pop();
    if(psub == true) {
      file_name = title + ' '+ 'U-- ' +auth+ '.'+ext
    } else {
      file_name = title+ '.' +ext
    }
      await downloadFile( v.link,file_name)
   }
    console.log({re});

}
此方法下载检索到的文件

var downloadFile =  async (link,filename) => {

  request
    .get(link)
    .on('error', function(err) {
      console.log(err)
    })
    .pipe(writeFile(filename,dir))
    .on('finish', () => {
          console.log('Downloaded Image: ' + filename);

      });
 }
这两个函数都可以正常工作,但这里的问题是执行顺序

第一个函数中的console.log({re})不应该在downloadFile函数中的console.log之后出现吗?我得到了相反的结果。
我想在for循环完成后执行一个函数它的工作

您的downloadFile函数返回一个承诺,该承诺会立即得到解决,因为它不等待任何异步操作。这可以通过使用一个返回承诺的请求库来解决,但我假设您使用的是一个不返回承诺的请求库

您可以将该请求包装在一个承诺中,该承诺在回调中解析该承诺。这被称为“承诺”回调

异步函数getAlbum(sub、title、id、psub、auth){ 设p={} 设alburls=[] 让结果=等待getAlbumImages(id) 设re=[{} 适用于(第五部分) { var ext=v.link.split('.').pop(); 如果(psub==真){ 文件名=title+'+'U--'+auth+'.+ext }否则{ 文件名=标题+'.'+ext } 等待下载文件(v.link,文件名) } console.log({re}); } var downloadFile=async(链接,文件名)=>{ 返回新承诺((解决、拒绝)=>{ 要求 .get(链接) .on('error',函数(err){ console.log(错误) 拒绝 }) .pipe(writeFile(文件名,目录)) .on('finish',()=>{ log('下载的图像:'+文件名); 解决() }); }
}< /代码>您可以考虑使用约定:您已经声明“代码>下载文件< /COD>作为<代码>异步代码/代码>函数,但不在函数内等待。implementation@Bosco你建议我在哪里使用承诺?@Sai,是的,所有axios方法都会回报承诺。我认为re是一个fork-for-request,支持promises,当然,您可以在浏览器中使用fetch(或者在服务器端使用node-fech)如果你使用一个返回承诺的API,你不需要把函数标记为<代码> AycNc<代码> .@ SAI,也考虑如果你真的需要按顺序加载文件。因为请求是独立的,它们可以同时被触发。你可以等待所有的结果(使用承诺。。不用担心。我刚刚阅读了你对这个问题的评论,似乎你正在使用Axios,它已经返回了承诺。我可以建议你不要使用回调吗?如果你愿意,我可能会发布一个编辑。我没有使用Axios。请发布你的建议。好的。如果是这样的话,那么你会一直使用回调,直到nodejs得到它的所有预期核心模块都脱离了实验模式。