2016-03-06 83 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代码,因此您需要构建一些将您的组件连接到该流的机制。