2016-12-17 80 views
0

我上的角2服務在運行下面的代碼的離子2應用程序:結果承諾的Facebook登錄

signInWithFacebook(): firebase.Promise<any> 
{ 
    if (this.platform.is('cordova')) 
    { 
     console.log('Running on cordova...'); 

     Facebook.login(['email', 'public_profile']).then(res => 
     { 
      const facebookCredential = firebase.auth.FacebookAuthProvider.credential(res.authResponse.accessToken); 
      console.log('credential value', facebookCredential); 
      var temp = firebase.auth().signInWithCredential(facebookCredential); 
      console.log('temp value: ', temp); 
      return temp; 
     });      
    } 
    else 
    { 
     return this.auth$.login({ 
      provider: AuthProviders.Facebook, 
      method: AuthMethods.Popup 
     }); 
    } 

} 

然後我登錄組件頁面上我這樣稱呼它,上的登錄按鈕:

pubic doFacebookLogin(): void 
{ 
    var temp = this.userDataService.signInWithFacebook() 
     .then(() => 
     { 
      console.log("Passed here! [1]"); 

      this.onSignInSuccess(); 

      console.log("Passed here! [2]"); 
     }); 
} 

我的控制檯登錄以下,當我按一下按鈕:

Running on cordova...

main.js:46695 TypeError: Cannot read property 'then' of undefined at LoginPage.doFacebookLogin (main.js:50920).....

credential value Lf {accessToken: "xxxxxx", provider: "facebook.com"}

temp value: I {F: 0, ka: undefined, o: I, fa: null, Ma: null…}

我期待的流程是這樣的:

  1. 調用doFacebookLogin()方法
  2. 調用service.signInWithFacebook()方法 控制檯登錄「運行在科爾多瓦...」
  3. 步驟[1]等待返回[2]
  4. 調用Facebook.login(['email', 'public_profile'])
  5. 的promisse當[4]結論登錄時,它調用firebase.auth().signInWithCredential()方法,它返回一個承諾太 控制檯日誌「證書值」和「臨時值」
  6. 的結果承諾[5]然後,對service.signInWithFacebook()功能
  7. doFacebookLogin()函數最後處理的承諾上返回的返回[6]和執行onSignInSuccess()

但是從控制檯日誌,我們可以看到它正在記錄'運行在科爾多瓦',然後我們在第一個函數的調用.then(所以Facebook登錄結果承諾尚未處理(所以返回承諾不存在),以及之後這個Facebook登錄處理(現在它已經存在,但其他功能已經試圖處理它,產生異常)。

我對這些承諾失去了什麼?

回答

1

它看起來像你只是缺少return

return Facebook.login(....).then(...); 
+0

OMG !!真是太遺憾了,我發佈了它!但是,真的,我花了半天的時間試圖找到它。現在我只是想知道爲什麼Typescript沒有抱怨並不是所有的路徑都返回了一些東西......真的非常感謝! – RBasniak

+0

不要冒汗。我們都做了類似的事情。 –