После отправки запроса продолжите проверку на завершение |Node.js - PullRequest
0 голосов
/ 12 сентября 2018

Я делаю пост-запрос с хорошим объемом данных, который займет около минуты, чтобы закончить сохранение. Хостинг, который я использую для этого, будет задерживать запросы через 5 секунд, поэтому мне нужно настроить его так, чтобы периодически проверять, завершено ли сохранение данных, чтобы получить окончательное обновление.

Я использую request-promise и рассмотрел оба подхода setTimeout и setInterval. В моей последней попытке (ниже) я использую setTimeout подход, но мой второй then продолжает вызываться почти сразу. Я хочу, чтобы это зависало на первом этапе then, пока оно не будет проверено несколько раз (24 здесь) или фактически закончено.

Возможно, у меня совершенно неправильный подход, но я не нахожу примеров того, на что я пытаюсь ссылаться. Будем весьма благодарны за любые указания на хороший пример этого или на то, где я иду не так.

const request = require('request-promise');

function checkFiles () {
  return request({
    uri: `${process.env.ROOT_URL}/api/v1/get/file-processing`,
    method: 'GET',
    json: true
  })
    .then(res => { return res; })
    .catch(err => { return err; });
}

async function init () {
  const filesPostOptions = {/* request options */};

  await request(filesPostOptions)
    .then(async status => { // THEN #1
      if (status.status === 201) {
        return status;
      }

      let checks = 0;

      const checkIt = function() {
        checks++;
        checkFiles()
          .then(res => {
            if (res.status === 201 || checks > 24) {
              status = res;
              return status;
            } else {
              setTimeout(checkIt, 5000);
            }
          })
          .catch(err => {
            console.error(err);
          });
      };

      checkIt();
    })
    .then(status => { // THEN #2
      if (!status.status) {
        throw Error('Post request timed out.');
      }

      return status;
    })
    .catch(err => {
      err = err.error ? err.error : err;
      console.error(err);
    });
}

Почтовый ответ доставит ответ со свойством status (код состояния) и свойством message.

1 Ответ

0 голосов
/ 12 сентября 2018

Вам необходимо контролировать возврат в "THEN #", добавив Promise:

.then(async status => { // THEN #1
  return new Promise((resolve, reject) => { // <---- prevent an immediate return
    if (status.status === 201) {
      return resolve(status);
    }

    let checks = 0;

    const checkIt = function() {
      checks++;
      checkFiles()
        .then(res => {
          if (res.status === 201 || checks > 24) {
            status = res;
            resolve(status);
          } else {
            setTimeout(checkIt, 1000);
          }
        })
        .catch(err => reject(err));
    };

    checkIt();
  })
})
...