等待下载方法完成后再运行下一个.then - node.js

4

我正在尝试通过构建一个允许用户下载文件的小应用程序来练习node。我已经将文件保存在S3上,将url保存在mLab DB中,并希望将文件下载到应用程序中,以便在客户端使用url作为href。目前它可以工作,但只下载了一个空文件。我认为这是因为它在文件下载之前就运行了下一个then()。

我当前的代码如下:

(async err => {
    const charge = await stripe.charges
      // create stripe charge
      .create({
       ...
      })
      // when the payment is successful, 
      // download the file locally to a 'dist' folder
      // so we can use it on the success page
      .then(() => {
        download(url_to_file, "dist").then(() => {
          console.log("done!");
        });
      })
      // then render the success page
      .then(
        res.render("success", {
          fileUrl: ...
        })
      )

所以在客户端上,我可以(使用ejs)做如下操作:

<a href="<%= /dist/fileUrl %>">下载</a>

我非常新于使用promise,不确定如何等待下载方法完全完成后再运行下一个then并呈现成功页面。

目前,该方法会运行,然后呈现成功页面,随后文件出现在应用程序中。这允许文件被下载,但文件为空。

有人能够指引我正确的方向/解释如何在运行下一个.then()方法之前等待下载完成吗?任何帮助将不胜感激!


尝试将调用返回给 download;例如:.then(() => { return download(url_to_file, "dist").then(() => { console.log("done!"); }); }) - Scott Rudiger
嗨@ScottRudiger,感谢您的回复。这样可以正确下载文件,但是下载的文件仍然为空。 - Thomas Allen
1个回答

3
如果我没弄错的话,只需要从“download”中返回promise即可。
没有“return”的情况下。

Promise.resolve().then(()=> {
  new Promise(resolve => {
    setTimeout(() => {
      console.log('done 1');
      resolve();
    }, 1000);
  });
}).then(() => {
  console.log('done 2');
});

使用return关键字

Promise.resolve().then(()=> {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log('done 1');
      resolve();
    }, 1000);
  });
}).then(() => {
  console.log('done 2');
});


嗨@Mosh,感谢回复。我刚刚用Promise包装了下载,但是当记录所有内容时,它会开始下载,呈现成功页面,然后完成下载。.then(() => { Promise.resolve().then(() => { return new Promise(resolve => { console.log("开始下载"); return download(fileUrl, "dist").then(() => { console.log("下载完成!"); }); resolve(); }); }); }).then(...) - Thomas Allen
好的,这是一个不同的问题。我没有足够的信息来尝试解决它。如果您尝试直接从“url_to_file”获取文件(使用浏览器或其他方式),您是否能得到正确的文件? - Mosh Feu
当我使用console.log时,它显示正确的URL,并且在实际项目文件夹中也正确显示,当我打开文件(mp3)时它可以播放,但是由于某种原因从浏览器下载的文件为空。 - Thomas Allen
download 方法是什么样子的?它来自第三方包吗? - Mosh Feu
是的,我正在使用Node下载包(npm download),所以方法是:download(req.body.total_source, "dist").then(() => { console.log("已下载!"); resolve(); }); - Thomas Allen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接