NativeScript Firebase插件执行顺序

时间:2017-04-05 10:41:59

标签: angularjs angular firebase nativescript

我正在学习NativeScript / Angular 2,需要帮助解决这个问题。

为了在Firebase平台中实现多角色登录系统,我考虑了这个解决方案

  1. 通过Firebase身份验证登录用户
  2. 查询/stores/的{​​{1}}路径,其中store字段与刚刚登录的电子邮件相同
  3. 如果我找到了,我会在merchantEmail服务中设置store ID,该服务使用BackendService来存储令牌,然后路由到getString/setString
  4. 如果我找不到,只需路由到MerchantDashboardComponent
  5. 这是我在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

    除了商家被路由到买方信息中心之外,一切都有效。我已经设法发现执行顺序不是我预期的,事实上:

    1. 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}); } } ); } 被执行并返回Promise
    2. firebase.login()处理程序在.then()方法
    3. 中执行
    4. 只有在此之后,doLogin()方法才能完成回调并且我的令牌可用,但firebase.query()已导航用户,因为{I}在我需要时仍然为空
    5. 我希望我尽可能地清楚。 谢谢你的关注。

      问候, 的Davide

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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);
        }
    })
});