我有一个路由(/mediumData
),可以在每次重新加载网站时调用。以下是路由的快速路由器处理程序:
router.get("/mediumData", (request, response) => {
getMediumData
.then(mediumData => {
response.json(mediumData)
})
.catch(error => {
response.send(error)
})
});
我遇到的问题是,只有在服务器重新启动时才会调用promise getMediumData
,而不是像预期的那样在每个页面加载。
当我尝试使用console.log
语句调试代码时,我发现console.log
正在getMediumData.then
处理程序中执行(在页面刷新时)。但是,getMediumData
承诺不会在页面刷新时执行任何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...
)
});
答案 0 :(得分:3)
承诺只能被解决/拒绝一次,这只是它们的工作方式。因此,这里一个简单的解决方案是将现有的getMediumData
承诺包装在为每个请求创建新承诺的函数中。
例如:
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)
});
});
答案 1 :(得分:1)
由getMediumData
承诺包装的代码只执行一次。要在每个请求中执行它,您可以将分配(即getMediumData = new Promise(...)
)移动到路径正文中。
或者,您可以将promise创建逻辑包装到每次返回新promise的函数中,并在路径中使用该函数。
const getMediumDataPromise = () => new Promise(
(resolve, reject) => {
console.log("This text only gets outputted on server restarts.");
https
.get(
// Some stuff...
)
}
);
router.get("/mediumData", (request, response) => {
getMediumDataPromise()
.then(mediumData => {
console.log("This text gets outputted on every page refresh.");
response.json(mediumData)
})
.catch(error => {
response.send(error)
})
});