首页 > 解决方案 > 后续路由请求不会重新调用 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处理程序内部执行(在页面刷新时)。但是,getMediumDatapromise 不会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...
        )
});

标签: javascriptnode.jsexpressasynchronouspromise

解决方案


承诺只能被解决/拒绝一次,这就是它们的工作方式。因此,一个简单的解决方案是将现有的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)
  });
});

推荐阅读