6

に関する情報を照会するために使用されなければならないSDK私はFacebookのJavascriptをアクティブなアクセストークンが私のコードでは、現在のユーザー

FB.api('/me/friends', function(response) { 
      if(response.data) { 
       //TODO : what to do if no. of friends is more than 5000 (pagination by fb) 
       friends_data=response.data; 
       dijit.registry.byId("mainWidget_div").set_friends_data(friends_data); 
      } else { 
       alert("Error!"); 
      } 

      }); 

を持っており、これはエラーになります。私は(コンソールに)手動でこの関数を呼び出した場合しかし、そこにはエラー

FB.api('/me/friends', function(response){r=response;}); 
//wait a while 
r 

ません、今r.dataは私の友人の配列です。

ネットワークパネルを確認したところ、手動​​で呼び出すと、アクセストークンが自動的にリクエストURLに挿入され、コード経由で呼び出されるとアクセストークンが挿入されません。

私のアプリケーションでフルFB SDKのロードコードはこれです:

<script type="text/javascript"> 
     // You probably don't want to use globals, but this is just example code 
     var fbAppId = "{{facebook_app_id}}"; 

     // This is boilerplate code that is used to initialize the Facebook 
     // JS SDK. You would normally set your App ID in this code. 

     // Additional JS functions here 
     window.fbAsyncInit = function() { 
     FB.init({ 
      appId  : fbAppId,  // App ID 
      status  : true,   // check login status 
      cookie  : true,   // enable cookies to allow the server to access the session 
      xfbml  : true   // parse page for xfbml or html5 social plugins like login button below 
     }); 

     // Put additional init code here 
     dojo.ready(function(){ 
      FB.api('/me/friends', function(response) { 
      if(response.data) { 
       //TODO : what to do if no. of friends is more than 5000 (pagination by fb) 
       friends_data=response.data; 
       dijit.registry.byId("mainWidget_div").set_friends_data(friends_data); 
      } else { 
       alert("Error!"); 
      } 

      }); 
     }); 
     }; 
     // Load the SDK Asynchronously 
     (function(d, s, id){ 
     var 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/all.js"; 
     fjs.parentNode.insertBefore(js, fjs); 
     }(document, 'script', 'facebook-jssdk')); 

    </script> 

答えて

2

私の推測では、あなたがFacebookのAPIが完全に初期化される前に、友人のリストを取得しようとしているということでしょう。あなたが見ているエラーは何ですか?

DOM ready(dojo.ready)で実行するFB.api呼び出しを登録しています。これにより、fbAsyncInitにすべてがラップされていても、同期が外れて読み込まれる可能性があります。フレンドAPIコール自体はDOMに依存しないので、dojoコールでラップしません。あなたはコンソールでそれをしていないし、それは動作しています。

私はJavaScriptのエキスパートです。私がおそらく間違った推測をした場合、これが起こる理由はjavascript巻き上げと関係している可能性があります。

+0

ありがとうございました!あなたはあなたの推測とまったく同じではありませんが、答えに私を導いてくれました。 – Eva

4

answer from Brent Baisleyanother answerは別の質問で、何が間違っていたかを理解するのに役立ちました。

FB.init()依存メソッドは、非同期にロードされるため、FB.init()の直後に呼び出すことはできません。 dojo.ready()のようにデータを非同期にロードすることは役に立ちません。 FB.getLoginStatus()にコードをラップする必要があります。

関連する問題