javascript - 后续路由请求不会重新调用 Node/Express 承诺
问题描述
问题
我有一个路由(/mediumData
),在网站的每个页面重新加载时都会被调用。这是路由的快速路由器处理程序:
router.get("/mediumData", (request, response) => {
getMediumData
.then(mediumData => {
response.json(mediumData)
})
.catch(error => {
response.send(error)
})
});
我遇到的问题是getMediumData
只有在服务器重新启动时才会调用承诺,而不是像预期的那样在每个页面加载时调用。
我试过的
当我尝试使用console.log
语句调试代码时,我发现console.log
正在getMediumData.then
处理程序内部执行(在页面刷新时)。但是,getMediumData
promise 不会console.log
在页面刷新时执行任何语句(只有在服务器重新启动时才会console.log
执行)。
这是我正在谈论的有关console.log
调试的示例:
getMediumData.then
处理程序
router.get("/mediumData", (request, response) => {
getMediumData
.then(mediumData => {
console.log("This text gets outputted on every page refresh.");
response.json(mediumData)
})
.catch(error => {
response.send(error)
})
});
getMediumData
承诺
const getMediumData = new Promise((resolve, reject) => {
console.log("This text only gets outputted on server restarts.");
https
.get(
// Some stuff...
)
});
解决方案
承诺只能被解决/拒绝一次,这就是它们的工作方式。因此,一个简单的解决方案是将现有的getMediumData
Promise 包装在一个函数中,该函数为每个请求创建一个新的 Promise。
例如:
const getMediumData = () => new Promise((resolve, reject) => {
https
.get(
// Some stuff...
)
});
router.get("/mediumData", (request, response) => {
getMediumData().then(mediumData => {
response.json(mediumData)
}).catch(error => {
response.send(error)
});
});
推荐阅读
- angular - 如何知道我的 html 组件的翻译文件中的元素是否为空?
- sql - 用函数反转where子句,有可能吗?
- matlab - MATLAB:`vertcat` 反转(2D 到 3D)
- c# - 长期订阅 Rx 主题导致巨大的内存泄漏
- python - 用于 3D 语义分割任务的 Keras 预处理
- python - 如何从 Matplotlib 中的 3D 圆中获取弧?
- azure-application-insights - Grafana 6.2 和 Azure App Insights 中的自定义指标
- ios - Mapbox route more 2 注释
- ubuntu - Elasticsearch 集群崩溃
- python - 发生错误,例如 myclass() 没有参数