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