在尝试使用Google身份验证解决执行顺序问题时(即等待异步调用完成),我遇到了这个奇怪的错误。如果我不添加.subscribe
,一切正常,但我要等到谷歌弹出窗口返回后再继续其他事情。我正在尝试更改“signIn()”以返回一个observable(它曾经没有返回任何内容),我遇到了这个错误:
TypeError:无法读取undefined的属性'subscribe'。
订阅发生错误的部分:
this._authService.signIn().subscribe(
value => console.log(value),
error => console.error(error),
() => console.log("done")
);
改变了服务方法:
signIn(): Observable<boolean> {
const signOptions: gapi.auth2.SigninOptions = {scope: SCOPES };
if (this._googleAuth)
Observable.fromPromise(this._googleAuth.signIn(signOptions))
.subscribe(response => {
var user:any = response;
if(response === true) {
this.handleSuccessLogin(user);
return Observable.of(true);
}
else {
return Observable.of(false);
}
});
}
else {
console.error("Google Authentication not initialized");
return Observable.of(false);
}
}
更新:这是我的版本直接从signIn返回。根据第一个建议:
signIn(): Observable<{}> {
const signOptions: gapi.auth2.SigninOptions = {scope: SCOPES };
if (this._googleAuth) {
return Observable.fromPromise(this._googleAuth.signIn(signOptions))
.map(response => {
var user:any = response;
if(response === true) {
this.handleSuccessLogin(user);
}
return response;
});
}
}
仅供参考:我之前提出的导致此更改的问题:Angular - waiting for Google authentication to complete
答案 0 :(得分:1)
从异步调用返回结果将无法按预期工作。您可以更改this._googleAuth
分支以直接返回Observable并在map
部分执行您想要的操作:
return Observable.fromPromise(this._googleAuth.signIn(signOptions))
.map(response => {
var user:any = response;
if(user) {
this.handleSuccessLogin(user);
return true;
} else {
return false;
}
});
参考 Plunker demo 。