Node / Express承诺不会在后续路由请求中被重新调用

时间:2018-04-25 01:25:50

标签: javascript node.js express asynchronous promise

问题

我有一个路由(/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...
        )
});

2 个答案:

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