2016-03-06 73 views
-1

調用異步操作我有一類在ComponentDidMountjavascript和反應的成分

它就像調用一些異步操作:

componentDidMount(){ 
// var my_call = new APICall() 
Promise.resolve(new APICall()).then(console.log(FB)) 
} 

class APICall{ 
    constructor(){ 
     window.fbAsyncInit =() => { 
       FB.init({ 
        appId  : '254258789655', 
        cookie  : true, 
        xfbml  : true, 
        version : 'v2.5' 
       }); 

      } 
     if (typeof(FB) == 'undefined') { 
      ((d, s, id) => { 
       let js, fjs = d.getElementsByTagName(s)[0]; 
       if (d.getElementById(id)) return; 
       js = d.createElement(s); 
       js.id = id; 
       js.src = "//connect.facebook.net/en_US/sdk.js"; 
       fjs.parentNode.insertBefore(js, fjs); 
      })(document, 'script', 'facebook-jssdk'); 
     } 
    } 
} 

export default APICall 

在這裏,但我的電話是不同步的。

只有在我的api類已被調用後,我如何才能調用then的值。

這裏是給我FB沒有定義的錯誤。我怎麼能先裝sdk,然後調用FB

謝謝

+0

這取決於'APICall'實際做了什麼/你應該讓它返回一個承諾。 – SLaks

+0

@亞歷山大可以請你看看我的更新並給我想法? – gamer

+0

什麼是「FB」?這個變量在哪裏定義?什麼是'sdk'?你根本沒有提供清晰的圖像,而且看起來你真的失去了範圍和執行上下文。幫助我們幫助你。 – Oka

回答

1

.then需要一個功能參考,而你給它的console.log返回的結果,這是undefined

副作用是console.log被調用,而"hellooww"被打印。

您需要提供一個新的執行上下文,也稱爲回調。

componentDidMount() { 
    Promise.resolve(new APICall()).then(function() { 
    console.log("hellooww"); 
    }); 
} 
+0

我已經編輯了我的問題。你能幫忙嗎? – gamer

+0

我目前的答案仍然適用於您的代碼。請閱讀'.then'的函數簽名,並且認識到'.then(console.log(...))'不會做你認爲它的作用。 – Oka

+0

我添加了'.then(function(){console.log(FB)})'但它給我的FB沒有定義錯誤。這意味着'console.log(FB)'在我的'APICall()'類之前被調用 – gamer

0

當你調用Promise.resolve你返回一個解決的承諾,所以then被立即執行。 當您調用fbAsyncInit時,您可能需要執行then代碼,因此您需要構建一些將您的組件連接到該流的機制。