Узел / экспресс-обещание не вызывается повторно при последующих запросах маршрута - PullRequest
0 голосов
/ 25 апреля 2018

Проблема

У меня есть маршрут (/mediumData), который вызывается при каждой перезагрузке страницы веб-сайта.Вот обработчик экспресс-маршрутизации для маршрута:

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

Проблема, с которой я сталкиваюсь, заключается в том, что обещание 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 голосов
/ 25 апреля 2018

Код, завернутый в обещание 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)
        })
});
0 голосов
/ 25 апреля 2018

Обещания могут быть разрешены / отклонены только один раз, это просто, как они работают. Таким образом, простое решение - заключить ваше существующее обещание 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)
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...