使用request-promise-native的Node.js JavaScript异步问题

时间:2018-10-06 14:48:16

标签: javascript node.js request-promise

我已经用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 个答案:

没有答案