如何延迟获取请求,直到异步功能完成加载

时间:2020-10-02 20:19:25

标签: javascript node.js async-await

在我的Express服务器中,根get请求在async function完成列出数据库文件之前发生,但是get请求需要该函数提供的信息以正确呈现页面。如何让get请求等到其他功能完成?

我看过其他解决方案:

Request - Wait till API call is completed Node.js

How to get Express Node route to wait for function before rendering

Wait a async operation before execute render in express using NodeJs

但是答案似乎不足以解决我的问题。

async function listFiles() {

  artWorks = [];

  const [files] = await storage.bucket(bucketName).getFiles();

  files.forEach(file => {
    function splitStr(str) {
      var string = str.split("/");
      artWorks.push(
        {
          imgCategory: string[0],
          subCat: string[1].replace(/-/g, ' '),
          imgSrc: bucket + file.name,
          thumbnail: thumbBucket + file.name.split('.')[0] + "-thumb.jpg",
          alt: string[2]
        });
    }
    var str = file.name;
    splitStr(str);
  });
  console.log("files listed");
}


listFiles().catch(console.error);


app.get("/", function(req, res) {
  let randomArt = Math.floor(Math.random()*artWorks.length);
    setTimeout(() => {
      res.render("index", {
          randomArt: randomArt,
          artWorks: artWorks
        })
    }, 500);
});

您可以看到我当前的解决方案是将res.render放在setTimeout内以使其等待,但是我设置了任意时间,有时它不起作用。它呈现的页面"index"使用artWorks数组的随机选择的索引,如果数组索引大于50,则listFiles()函数尚未完成,因此无法加载主页说:

TypeError: Cannot read property 'imgCategory' of undefined

一些注意事项:
在我在根listFiles()请求之外的代码的其他部分中调用get函数时,它必须独立于get请求。

第一次有人访问该网站时,它将引发错误并且不呈现页面,但是在刷新artWorks数组之后,页面将呈现,我认为是因为它已经缓存了必要的信息点。

那么在保持功能独立的同时让渲染等待的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

等待诺言通过更改而解决:

listFiles().catch(console.error);

收件人:

listFiles()
  .then(() => {
    app.get("/", function(req, res) {
      let randomArt = Math.floor(Math.random()*artWorks.length);
      res.render("index", {
        randomArt: randomArt,
        artWorks: artWorks
      })
    });
  })
  .catch(console.error);
相关问题