[英]javascript how to use make process wait until async function finishes
[英]How to delay get request until async function finishes loading
在我的快速服务器中,根get
请求发生在async function
完成列出数据库中的文件之前,但get
请求需要来自函数的信息才能正确呈现页面。 我怎样才能get
请求等到其他功能完成?
我看过其他解决方案:
在使用 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.