【问题标题】:Wait for download method to finish before running next .then - node.js等待下载方法完成后再运行下一个 .then - node.js
【发布时间】:2019-03-04 09:20:31
【问题描述】:

我正在尝试通过构建一个允许用户下载文件的小型应用程序来练习 node。

我已将文件保存在 S3 上,将 url 保存在 mLab 数据库中,并希望将文件下载到应用程序,以便我可以在客户端将 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 %>">Download</a>

我对 promises 很陌生,不知道如何等待下载方法完全完成,然后再运行下一个 then 并呈现成功页面。

此时,方法运行,然后成功页面呈现,然后文件出现在应用程序中。这允许下载文件但文件为空。

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

【问题讨论】:

  • 尝试将呼叫返回到download;例如:.then(() => { return download(url_to_file, "dist").then(() => { console.log("done!"); }); })
  • 嗨@ScottRudiger,感谢您的回复。这会正确下载文件,但下载时文件仍然是空的。

标签: javascript node.js express download


【解决方案1】:

如果我没记错的话,只需return 来自download 的承诺。

没有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("Started download"); return download(fileUrl, "dist").then(() => { console.log("downloaded!"); }); resolve(); }); }); }).then(...)
  • 我在错误的地方使用了 resolve()。它现在以正确的顺序运行所有方法,但是下载的文件仍然是空的。查看项目文件夹时,它肯定在那里并且看起来很好,所以不知道为什么它在下载时说它是空的
  • 嗯,这是一个不同的问题。我没有足够的信息来试图弄清楚。如果您尝试直接从url_to_file 获取文件(使用 brwoser 或其他工具),您会得到正确的文件吗?
  • 是的,当我 console.log 它时,它说它是正确的 url,并且在实际的项目文件夹中它显示正确并且当我打开它时文件 (mp3) 播放,但由于某种原因文件从浏览器下载的是空的。
  • download 方法是什么样的?它来自第 3 方包吗?
猜你喜欢
  • 1970-01-01
  • 2018-12-19
  • 2011-07-05
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2021-11-23
  • 2020-04-14
  • 1970-01-01
相关资源
最近更新 更多