我正在学习NativeScript / Angular 2,需要帮助解决这个问题 .
为了在Firebase平台中实现多角色登录系统,我考虑了这个解决方案
-
通过Firebase身份验证登录用户
-
查询
/stores/
的/stores/
路径,该路径的merchantEmail
字段与刚刚登录的电子邮件相同 -
如果我找到了,我将
store
ID设置在BackendService
服务中,该服务使用getString/setString
来存储令牌,然后路由到MerchantDashboardComponent
-
如果我找不到,只需路由到
BuyerDashboardComponent
这是我在 login.service
中的代码的一部分:
login (email: string, password: string) {
return firebase.login({
type: firebase.LoginType.PASSWORD,
email: email,
password: password
}).then(
(result: any) => {
firebase.query(
(_result) => { // Here I set BackendService.storeID
在 .query()
回调中,我在应用程序中分配了我需要的标记 .
这是我在 login.component
中使用的方法:
doLogin () {
this.isAuthenticating = true;
if (!this.validateEmail()) {
alert("Please insert a valid email");
return false;
}
this.loginService.login(this.email, this.password).then(
() => {
this.isAuthenticating = false;
if (BackendService.loginError)
alert(BackendService.loginError)
else if (BackendService.storeID != '') {
this.router.navigate(['/merchant-dashboard'], {clearHistory: true});
}
else {
this.router.navigate(['/home/categories'], {clearHistory: true});
}
}
);
}
一切都有效,除了商家被路由到买方仪表板的事实 . 我设法发现执行顺序不是我预期的,实际上:
执行
-
firebase.login()
并返回Promise -
.then()
处理程序在doLogin()
方法内执行 -
仅在此之后,
firebase.query()
方法完成回调并且我的令牌可用,但是doLogin()
已经导航了用户,因为storeID
在我需要时仍然是空的
我希望我尽可能地清楚 . 感谢您的关注 .
问候,达维德
2 回答
所以,问题出在登录服务方法中 . 我现在返回由
firebase.query()
生成的Promise
,这会导致then()
调用以正确的顺序链接 .是的,这正是我打算将它包装在一个承诺中并创建一个链 .
示例代码