Асинхронные проблемы с 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}`);
}
...