我正在尝试创建一个调用http请求的方法。如果请求返回401错误,我想重新登录并再次尝试请求。我的方法如下所示:等待异步方法完成
return this.http.post(url, this.cleanData(body), this.appendHttpHeaders(options))
.map(response => response)
.catch(error => {
if (error.status === 401) {
this.loginService.login(true).then(() => {
console.log("login should be finished: " + this.loginService.isLoggedIn());
return this.http.post(url, this.cleanData(body), this.appendHttpHeaders(options))
.map(response => response);
})
} else {
this.errorReportingService.reportHttpError(error);
return Observable.throw(error);
}
});
public login(forceLogin = false, loginCallback:() => any = null): Promise<String> {
...
console.log(1);
return new Promise((resolve, reject) => {
console.log(2);
this.popupLogin(loginCallback).then((result) => {
console.log(11);
resolve();
})
}).then(() => {
return new Promise((resolve, reject) => {
console.log(12);
resolve();
})
})
}
private popupLogin(loginCallback:() => any = null): Promise<String> {
...
console.log(3);
return new Promise((resolve, reject) => {
console.log(4);
this.handleLoginPopupFeedback(loginPopupHandle, loginCallback).then((result)=> {
console.log(9);
resolve();
})
}).then(() => {
return new Promise((resolve, reject) => {
console.log(10);
resolve("ok");
})
})
}
private handleLoginPopupFeedback(loginPopupHandle: Window, loginCallback:() => any = null): Promise<string> {
...
} else {
// ...popup is accessible, check values
let loginSuccessElement = loginPopupContent.getElementById('trucareOAuthLoginSuccess');
let loginFailureElement = loginPopupContent.getElementById('trucareOAuthLoginFailure');
if (!loginPopupHandle.closed &&
(loginSuccessElement === null || loginSuccessElement === undefined) &&
(loginFailureElement === null || loginFailureElement === undefined)
) {
console.log(5);
return new Promise((resolve, reject) => {
console.log(6);
setTimeout(() => {
console.log(7);
this.handleLoginPopupFeedback(loginPopupHandle, loginCallback).then((result) => {
console.log(8);
resolve();
}, 500)
})
});
}
...
}
return Promise.resolve("4");
}
问题是登录调用是异步的。有没有办法等待loginService.login()完成,然后再次尝试请求?
编辑:根据注释修改代码,但调用仍然不会重复,即使是console.log正在记录。但是,我甚至没有看到网络插口调用浏览器
不this.oginService.login()返回可观察到的? – cyrix
它没有。它所做的只是登录我 – user3048782
您需要让它返回一个承诺并使用该承诺。 – SLaks