Асинхронные проблемы с JavaScript в Node.js с использованием запроса-обещания-нативного

Я написал пакетный скрипт с Node.js, чтобы, среди прочего, проверить, чтобы убедиться, что версия URL HTTPS будет иметь тот же код состояния, что и версия HTTP (причина не важна). Если версия HTTPS возвращает 200, мне не нужно заботиться о HTTP. Если HTTPS возвращает ошибку, я хочу убедиться, что это тот же код состояния, что и HTTP. (Опять же, то, что я пытаюсь кодировать, не важно).

я использую request-promise-native чтобы получить доступ к URL. Но я не могу получить await / async работать так, как я ожидаю. Код выполняется в другом порядке, чем я ожидаю. Я ожидал, что код запускается с await на самом деле ждать, пока асинхронный вызов функции rp сделано, а затем перейдите к следующему утверждению в коде. Но это не так, он прыгает обратно на вершину первого if блок. Как заставить этот код обрабатывать последовательно, но ждать продолжения запроса, прежде чем продолжить?

async function accessDestination(url: string): Promise<number> {
  let statusCode: number = 999;
  const reqOpts: any = {
    method: 'GET',
    resolveWithFullResponse: true,
  };
  reqOpts.uri = url;
  await rp(reqOpts)
    .then((resp: any) => {
      ({ statusCode } = resp);
    })
    .catch((err: Error) => {
      statusCode = getStatusCodeFromReqError(err);
    });
  return statusCode;
}

async function normalizeAllUrls(): Promise<void> {
  await _.each(destinations, async (destination: any) => {
    if (url) {         <<<<< AFTER AWAIT, IMMEDIATELY GOES BACK TO HERE
      const normUrl: string = common_functions.urlNormalizer(url);
      if (url !== normUrl) {
        let useNormUrl: boolean = false;
        let origStatus: number = 0;
        const normStatus: number = await accessDestination(normUrl);     <<<<< THIS AWAIT CAUSES THE CODE TO IMMEDIATELY JUMP TO THE 'IF' NOTED ABOVE
        if ((normStatus >= 200 && normStatus <= 299) || normStatus === 302) {
          useNormUrl = true;
        } else {
          origStatus = await accessDestination(normUrl);
          if (normStatus === origStatus) {
            useNormUrl = true;
          } else {
            console.warn(`Normalized urls: status does not match - normStatus=${normStatus} / origStatus=${origStatus}; normUrl=${normUrl} / url=${url}`);
          }
...

0 ответов

Другие вопросы по тегам