问题
我有一个路径(/mediumData)在网站的每个页面重新加载时调用。以下是路由的快速路由器处理程序:

router.get("/mediumData", (request, response) => {
    getMediumData
        .then(mediumData => {
            response.json(mediumData)
        })
        .catch(error => {
            response.send(error)
        })
});

我遇到的问题是promisegetMediumData只在服务器重新启动时调用,而不是像预期的那样在每个页面加载时调用。
我试过的
当我试着用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...
        )
});

最佳答案

承诺只能解决/拒绝一次,这只是它们的工作方式。因此,这里的一个简单解决方案是将现有的getMediumDatapromise包装在一个函数中,该函数为每个请求创建一个新的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)
  });
});

10-06 11:44