2016-08-31 3 views
3

Promise<User>の結果を返すfirebase.login()を呼び出すuserServiceがあります。 UIコンポーネントでは、私は、ログイン(すなわち、成功またはエラー)の結果に反応する必要があり、他の場所プロジェクト内サービスからプロミスを使用する方法(ネイティブスクリプト/ firebase)?

firebase.login({ config... 
}) 
.then (function (result) { /* use result */}, 
     function (error) { /* use error */ }); 

:このように呼ばれています。私はルーティングや類似のロジックをユーザサービスに入れるのではなく、次に起こることを他のコンポーネントが制御するようにしたい。

どうしたのですか?他のコンポーネントはどのようにそれに反応できますか?

上記の成分は、LoginPageと呼ばれるクラスです。これにはLoginボタンがあり、Firebaseログインを開始する必要があります。このボタンは、LoginPageクラスの関数(login()とも呼ばれます)にリンクされています。

XML:then句は関係なく、常にログインの成功または失敗の、実行されるように

<Button [text]="Sign in" class="submit-button" (tap)="login()"></Button> 

login.component.ts

login() { 
    this._userService.login(this.user) 
    .then(function (data) { 
     /* go to next screen */ 
    }); 
} 

上記は、明らかに間違っています。ここで

userServiceでのログイン機能である:

@Injectable() 
export class UserService { 


    login(user: User) { 

    firebase.login({ 
     type: firebase.LoginType.PASSWORD, 
     email: user.email, 
     password: user.password 
    }) 
    .then(function (result) { 
     console.log("Successful Login! " + JSON.stringify(result)); 
     return result; 
    }, function (error) { 
     console.log(error); 
     return error; 
    }); 
} 
+1

コードの2番目の部分はAngularJSではなくAngular 2です。 'http'要求はRxJSが観測可能であり、約束ではありません! login()関数を呼び出すログインボタンとその他の関連コードのコードを指定することで、質問を改善できます。 – estus

+0

私はこれが異なっていることを認識しています(私の質問では、命名法なしでさえ多く述べました)。あなたはおそらく質問に答えることを試みることができますか?私は、ボタンとコントローラの 'login()'関数の間のリンクは意味がないと思う。私はその機能でサービスをどのように消費するかを知る必要があります。 – Mundi

+0

質問は現在のフォームで質の高い回答を得ることはできませんが、あなたのケースが何であるかは明確ではありません。 「その機能」とは何ですか?質問に関連するコードを明記し、回答者が重要であるかどうかを判断させてください。 – estus

答えて

2

UserServicelogin方法は、連鎖のためにそれを利用できるようにする約束を返す必要があります:元以上のログインエラーで

login(user: User) { 
    return firebase.login(...)... 
    } 

はすでにキャッチされました結果やエラーの可能性がある解決策が約束されます。

エラーを処理するための好ましい方法は、サービス自体のエラーをキャッチしないことです。私たちは、ログイン要求が成功したかどうかをいつも知りたいです。

login(user: User) { 

    return firebase.login(...) 
    // second callback is optional if we don't need to log errors 
    .then(function (result) { ... }, function (error) { 
     console.log(error); 
     return firebase.Promise.reject(error); 
    }); 
    } 

この方法でエラーことができますが(とも捕捉されなかった約束がある場合は、角2は、エラーがスローされます必要があります)キャッチして処理すること:

login() { 
    return this._userService.login(this.user) 
    .then(function (data) { 
     /* go to next screen */ 
    }) 
    .catch(function (error) { ... }); 
} 

で、約束を返すために、常に好ましいです。少なくともテスト目的のために。

+0

それが解決策です。私は適切なnativescript Slackチャンネルを介して同じものを見つけました。よくやった! :)私は、関数にボタンをリンクするメカニズムは完全に無関係であるが、私は正しいと思われる。また、 'return firebase.Promise.fulfill(result);'を最初のコールバックに追加するべきでしょうか? (私が見つけた他のコードは 'return JSON.stringify(result);'を返します。 – Mundi

+0

元のコードのように 'return result'にする必要がありますので差を強調するために省略しました' Promise.resolve' Promise.fulfill')は、結果が 'then'コールバックで返されたときに暗示されます。 – estus

関連する問題