繁体   English   中英

如何延迟获取请求直到异步函数完成加载

[英]How to delay get request until async function finishes loading

在我的快速服务器中,根get请求发生在async function完成列出数据库中的文件之前,但get请求需要来自函数的信息才能正确呈现页面。 我怎样才能get请求等到其他功能完成?

我看过其他解决方案:

请求 - 等待 API 调用完成 Node.js

如何在渲染前获取 Express Node 路由以等待功能

在使用 NodeJs 在 express 中执行渲染之前等待异步操作

但是对于我的问题,答案似乎不够普遍。

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数组已经完成并且页面将呈现,我认为是因为它已经缓存了必要的信息。

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

通过更改调用后等待承诺解决:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM