Javascript 节点/快速承诺不会在后续路由请求中被重新调用 问题
我有一个路由/媒体数据,在网站的每个页面上都会被调用。以下是该路由的快速路由器处理程序:Javascript 节点/快速承诺不会在后续路由请求中被重新调用 问题,javascript,node.js,express,asynchronous,promise,Javascript,Node.js,Express,Asynchronous,Promise,我有一个路由/媒体数据,在网站的每个页面上都会被调用。以下是该路由的快速路由器处理程序: router.get("/mediumData", (request, response) => { getMediumData .then(mediumData => { response.json(mediumData) }) .catch(error => { response.s
router.get("/mediumData", (request, response) => {
getMediumData
.then(mediumData => {
response.json(mediumData)
})
.catch(error => {
response.send(error)
})
});
我遇到的问题是,只有在服务器重新启动时才会调用promise getMediumData,而不是像预期的那样在每次页面加载时调用它
我试过的
当我尝试用console.log语句调试代码时,我发现console.log正在getMediumData中执行。然后页面上的处理程序刷新。但是,getMediumData承诺不会在页面刷新上执行任何console.log语句,只有在服务器重新启动时才会执行console.log
下面是一个关于我的console.log调试的示例:
getMediumData.then处理程序
getMediumData承诺
承诺只能解决/拒绝一次,这就是它们的工作方式。因此,这里的一个简单解决方案是将现有的getMediumData承诺封装在一个函数中,该函数为每个请求创建一个新的承诺 例如: const getMediumData=>newpromisersolve,reject=>{ https 收到 //一些东西。。。 }; router.get/mediumData,请求,响应=>{ getMediumData.thenmediumData=>{ response.jsonmediumData }.catcherror=>{ response.senderror }; }; getMediumData承诺包装的代码只执行一次。要在每个请求中执行它,您可以移动分配,即getMediumData=new 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)
})
});
或者,您可以将承诺创建逻辑封装到每次返回新承诺的函数中,并在路由中使用该函数
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)
})
});
谢谢你用有用的代码给出了清晰的答案!超级有用,它解决了我的问题@RobertCooper很高兴它有帮助!
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)
})
});