約束

2016-11-09 13 views
0

内から値を返す私は、サービスを注入サービスを提供しています。子サービスはfacebook apiに接続し、親サービスにユーザのログインステータスを返すと仮定します。私が直面しています問題は、このFBのAPI呼び出しが約束を使用すると私は子サービス関数呼び出しの値に基づいて、親サービスにいくつかのロジックを実行しようとしています。これを行う正しい方法は何でしょうか?約束

これは私が試したものです:下記のコードが正常にFacebookのAPIおよび出力に接続

facebook.service.ts

注、 "接続" それが必要として**

checkLoginStatus() { 
     this.FB.getLoginStatus((response) => { 
      console.log(response.status); //outputs "connected" 
     }); 

} 

はしかし、私は親サービスに約束の応答に含まれる値を返すようにしようとしていますので、以下のように、私は、コードを変更...とエラーを取得:

FB:any; 

    constructor() { 
     facebook().then((FB) => { 
      // Initialize SDK 
      FB.init({ 
       appId  : '1111111111111111', 
       cookie  : true, // enable cookies to allow the server to access 
            // the session 
       xfbml  : true, // parse social plugins on this page 
       version : 'v2.8' // use graph api version 2.5 
      }); 

      this.FB = FB; 

     }); 
    } 

    checkLoginStatus() { 
     this.FB.getLoginStatus((response) => { 
      return response.status; //"connected" 
     }); 
    } 

home.service.ts

constructor(@Inject(FacebookService) private fb:FacebookService) { 
    this.authenticateFacebook(); 
} 

authenticateFacebook() { 
    this.fb.checkLoginStatus().then((response) => { 
     console.log(response); //should output connected 
    }); 
} 
+0

何も印刷されていない場合、this.FB.getLoginStatus()に渡されたコールバックは決して実行されません。おそらく、getLoginStatus()呼び出しが失敗したためです。おそらく、エラーの場合には2番目のコールバックが必要です。この 'FB.getLoginStatus()'メソッドのドキュメントはどこにありますか? –

+0

@JBNizet、getLoginStatusは成功し、あなたが「返却」とはどういう意味ですか – AnchovyLegend

+0

「接続」返します。あなたは 'this.FB.getLoginStatus()'によって返された値を使用していません。代わりにコールバックを渡しています。そして何も印刷されていないので、それが何を返すか(またはあなたのコールバックに渡す)どのように知っていますか?ここでも、FB.getLoginStatus()のドキュメントは何ですか?あなたが指摘したことは、Facebookのライブラリを読み込むことができます。 FB.getLoginStatus()メソッドはドキュメント化されていません。 –

答えて

-2

facebook.service.tsはちょうどあなたが返すことができ、独自の約束に、あなたは戻り値を指定することができます解決値でそれを包みます。

public authenticateFacebook(): Promise<any> { 

     return new Promise((resolve, reject) => { 
      this.fb.checkLoginStatus().then(response => { 
       console.log(response); //should output connected 
       resolve(response); 
      }); 
     }); 

    } 
+0

Piotrの返信をありがとう。この答えは有望そうに見えますが、これは私にとってはうまくいかなかった...まだエラーはありません。 – AnchovyLegend

+0

これは動作しません - 私はそれを使用しています。 facebookではなく、値を返す一般的な原則として。 –

+0

拒否(値)を追加してエラーがあるかどうかを確認してください。おそらくcheckLoginstatusは、解決応答が機能していないというエラーが発生したときにエラーをスローします。 –

-1

エラーが示すように、あなたのサービスを呼び出しているときに、this.FBは、まだ定義されていません。初期化自体が非同期であるためです:Facebookは()ライブラリをロードし、それがロードされるときにのみ、this.FBが初期化されます。 this.FBを使用する前に、この初期化が完了するのを待つだけです。しかし、修正は比較的簡単です:

private fbPromise: Promise<any>; 

constructor() { 
    this.fbPromise = facebook().then((FB) => { 
     // Initialize SDK 
     FB.init({ 
      appId  : '1111111111111111', 
      cookie  : true, // enable cookies to allow the server to access 
           // the session 
      xfbml  : true, // parse social plugins on this page 
      version : 'v2.8' // use graph api version 2.5 
     }); 

     return FB; 
    }); 
} 

private authenticateFacebook(FB): Promise<any> { 
    return new Promise((resolve, reject) => { 
     FB.getLoginStatus(response => resolve(response)); 
    }); 
} 

checkLoginStatus(): Promise<string> { 
    return this.fbPromise 
       .then(FB => this.authenticateFacebook(FB)) 
       .then(response => response.status); 
} 
+0

返事をありがとう。しかし、2つの関数が異なるファイルにあり、実際の問題に実際には触れていないという事実を完全に無視しています。目標は 'home.service.ts'にログインステータスを出力することです。基本的に 'checkLoginStatus()'は別のファイルにあり、 'home.service.ts'ファイル内で' this.fbPromise'の必要性を避けようとしています...最初から最後まで読んでください。センス。 – AnchovyLegend

+0

アンソヴィーあなたはもう何を求めているのか分かりません。 –

+0

@Piotr、その本当に簡単な、元の記事を読んでください。一番上の 'facebook.service.ts'コードスニペットでは、「connected」がコンソールに記録されています。したがって、Facebook APIとのすべての通信は成功しています。さて、この文字列をコンソールに記録するのではなく、単に "接続された"文字列を 'home.service.ts'内の親サービスに返すだけです。上記の実装は、これを達成するのに役立つものではありません。 – AnchovyLegend