2016-11-09 89 views
0

我有一個注入服務的服務。子服務連接到facebook api,並假設將用戶的登錄狀態返回給父服務。我面臨的問題是這個fb api調用使用了一個承諾,我試圖根據子服務函數調用的值在父服務中執行一些邏輯。這樣做的正確方法是什麼?從承諾中返回一個值

這是我的嘗試:

facebook.service.ts

注意,下面的代碼成功連接到 「連接」 Facebook的API和輸出,因爲它應該**

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

} 

但是,我試圖返回承諾對父服務的響應中包含的值,所以我修改了代碼,如下所示...並獲取錯誤:

Uncaught (in promise): TypeError: Cannot read property 'getLoginStatus' of undefined 

facebook.service.ts

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()調用失敗。它可能期望在發生錯誤時進行第二次回調。這個'FB.getLoginStatus()'方法的文檔在哪裏? –

+0

@JBNizet,getLoginStatus成功並返回「connected」 – AnchovyLegend

+0

「返回」是什麼意思。您沒有使用'this.FB.getLoginStatus()'返回的值。您正在傳遞迴調。你怎麼知道它返回什麼(或傳遞給你的回調),因爲沒有打印?再次,FB.getLoginStatus()的文檔是什麼?你指的只是允許加載facebook庫。它不記錄方法FB.getLoginStatus()。 –

回答

-2

只是把它包在自己的諾言,你可以返回,並決心值,你可以指定一個返回值。

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

感謝您的回覆。但是,你完全忽略了這兩個函數在不同文件中的事實,並沒有真正解決實際問題。目標是在'home.service.ts'中輸出登錄狀態。基本上,'checkLoginStatus()'是在一個單獨的文件中,我試圖防止在'home.service.ts'文件中需要'this.fbPromise' ...從頭到尾讀取原始文件,它應該使感。 – AnchovyLegend

+0

An魚我不知道你在問什麼。 –

+0

@Piotr,其確實很簡單,閱讀原文。在最頂層的「facebook.service.ts」代碼片段中,「連接」被記錄到控制檯。因此,與Facebook API的所有通信都是成功的。現在,不是將此字符串記錄到控制檯,而是將「連接」字符串返回到「home.service.ts」中的父服務。上述實現無法以任何方式完成此操作。 – AnchovyLegend