我已经用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}`);
}
...