Опрос конечной точки http с помощью p-wait-for, возвращающего UnhandledPromiseRejectionWarning: TypeError: Ожидаемое условие для возврата логического значения - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть следующий код, который опрашивает конечную точку http, используя p-wait-for

const pWaitFor = require('p-wait-for');
const rp = require('request-promise-native');

const options = {
    method: 'GET',
    simple: false,
    resolveWithFullResponse: true,
    url: 'https://httpbin.org/json1'
};
const waitOpts = {interval: 15};

(async () => {
    await pWaitFor(rp(options), waitOpts);
    console.log('done calling');
})();

Я получаю ошибку

(node:36125) UnhandledPromiseRejectionWarning: TypeError: Expected condition to return a boolean
    at Promise.resolve.then.then.value (node_modules/p-wait-for/index.js:16:13)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
    at Function.Module.runMain (module.js:695:11)
    at startup (bootstrap_node.js:191:16)
    at bootstrap_node.js:612:3
(node:36125) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:36125) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Цель состоит в том, чтобы продолжать опрашивать конечную точку https://httpbin.org/json1 каждые 15 секунд. Он должен продолжать работать бесконечно, потому что он возвращает 404, и запрос-обещание превращается в отклоненное обещание.

Ответы [ 2 ]

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

p-wait-for ожидает возврата значения boolean (как вы узнали).

Лучшая версия, чем ваш ответ будет обрабатывать любую неожиданную ошибку, а также коды состояния 4xx и 5xx, см. Ниже:

const pWaitFor = require('p-wait-for');
const rp = require('request-promise-native');

const options = {
  method: 'GET',
  simple: false,
  resolveWithFullResponse: true,
  url: 'https://httpbin.org/json1'
};
const waitOpts = {interval: 1000};

const invokeApi = async () => {
  try {
  await rp(options);
  return true;
  } catch (_) {
    // non 200 http status
    return false
  }
};

(async () => {
  await pWaitFor(invokeApi, waitOpts);
})();
0 голосов
/ 07 сентября 2018

Мне удалось заставить его работать, вызвав функцию, возвращающую логическое значение (true / false)

const pWaitFor = require('p-wait-for');
const rp = require('request-promise-native');

const options = {
    method: 'GET',
    simple: false,
    resolveWithFullResponse: true,
    url: 'https://httpbin.org/json1'
};
const waitOpts = {interval: 1000};

const invokeApi = async () => {
    const res = await rp(options);
    if (res.statusCode === 200) {
        return true;
    } else {
        return false;
    }
};

(async () => {
    await pWaitFor(invokeApi, waitOpts);
})();
...