首页 文章

NativeScript Firebase插件执行顺序

提问于
浏览
0

我正在学习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 回答

  • 1

    所以,问题出在登录服务方法中 . 我现在返回由 firebase.query() 生成的 Promise ,这会导致 then() 调用以正确的顺序链接 .

  • 1

    是的,这正是我打算将它包装在一个承诺中并创建一个链 .

    示例代码

    return new Promise<any>((resolve, reject) => {
    
    firebase.login({ loginArguments })
        .then((result: any) => {
            var onQueryEvent = function (result) {
            };
    
            return firebase.query(
                onQueryEvent,
                "/owner",
                {
                    // query arguments follows here
                }
            ).then(res => {
                return res;
            })
    
        })
        .then(finalResult => {
            console.log(finalResult);
            try {
                resolve(finalResult);
            } catch (e) {
                reject(e);
            }
        })
    });
    

相关问题