0

C/C++を学んだら、JavaScriptやAPIのようなWeb関連のものを自分で教えようとしています。このプロジェクトは、Facebook JavaScript SDKを使用してFacebookでログインし、プロフィールから情報を表示する簡単なWebページであると考えられています。私はログインに成功しましたが、アクセストークンが必要なので、FB.api()の機能を呼び出す際に問題があります。今私はtokenと呼ばれるvarにアクセストークンを保存しようとしていますが、動作していないようです。私はデバッグに3つのconsole.log()を使用しています。何らかの理由で(FirefoxのF12 devコンソールによると)何らかの理由で最初に実行されたようだから、最後の/ 3番目の呼び出しがundefinedを返すことがわかりました。何が起こっている?FB.getLoginStatus()からのアクセストークンをvarに保存できません。

main.js:私はFBのJavaScript SDKを初期化して(私は他の場所でFBのオブジェクトを使用することができます)メイン呼んでいる方法

function main() 
{ 
    var token; 

    FB.getLoginStatus(function getLoginStatusCallback(response) 
    { 
     if (response.status === "connected") 
     { 
     document.getElementById("loginButton").style.display = "none"; 
     } 
     else 
     { 
     document.getElementById("loginButton").style.display = "all"; 
     } 
     //THIS OUTPUTS THE TOKEN SUCCESSFULLY 
     console.log(response.authResponse.accessToken); 
     //THIS WORKS 
     token = response.authResponse.accessToken; 
     //THIS OUTPUTS THE TOKEN SUCCESSFULLY 
     console.log(token); 
    }, true); 

    //THIS OUTPUTS UNDEFINED! 
    console.log("token = " + token); 

    Fb.api("/me", "get", token, function() { 
     //stuff here 
    }); 
} 

facebook.js:

window.fbAsyncInit = function() { 
    FB.init({ 
     appId: 'my app id here', 
     cookie: true, 
     xfbml: true, 
     version: 'v2.8' 
    }); 
    FB.AppEvents.logPageView(); 
    //CALLING MAIN HERE 
    main(); 
    }; 

    (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 = "https://connect.facebook.net/en_US/sdk.js"; 
    fjs.parentNode.insertBefore(js, fjs); 
    }(document, 'script', 'facebook-jssdk')); 

(最初のSDKの初期化を定義する)私のHTMLファイルのヘッダー:ここ

<head> 
    <meta charset="utf-8" /> 
    <title>Profile</title> 
    <link rel="stylesheet" href="style.css" /> 
    <script src="facebook.js"></script> 
    <script src="main.js"></script> 
</head> 

は、Firefoxからのdevのコンソールである(第3にconsole.logはいるようです最初のいくつかの理由で実行し、なぜこの出来事です):?

token = undefined main.js:23:4  <-- I think it should run last but it runs first 
TheTokenPrintsHere main.js:18:7 
TheTokenPrintsHere main.js:20:7 

私はトン場合は、C++/Cから来ています帽子が助けてくれます。これはAPIとWeb SDKに関する私の最初の経験です。ありがとうございました!

答えて

0

あなたのコードを実行しているJavaScriptの結果は、です。非同期です。function getLoginStatusCallback(response)ブロック内のコードはすべて、の後にのコードを実行します(2秒、5秒、または2分かかる可能性があります)。

JavaScriptにはスレッドが1つしかないため、このコードブロックは応答が受信されたときにのみ実行されるように、言語設計者は作成しました。

あなたが同期的に実行するようにコードを強制したい場合は、あなたがそのようなmain()の最初の子ブロック内の最後の2文を移動することができます。

function main() 
{ 
    var token; 

    FB.getLoginStatus(function getLoginStatusCallback(response) 
    { 
     if (response.status === "connected") 
     { 
     document.getElementById("loginButton").style.display = "none"; 
     } 
     else 
     { 
     document.getElementById("loginButton").style.display = "all"; 
     } 
     token = response.authResponse.accessToken; 

     console.log("token = " + token); 

     Fb.api("/me", "get", token, function() { 
     // this will work now. 
     }); 

    }, true); 
} 
+0

私はこれを回避するために何ができますか? – TomaszS

+0

@ TomaszS他にも解決策があります。これに関する最も一般的な方法は[Promise](https://developers.google.com/web/fundamentals/getting-started/primers/promises) – matthewninja

+0

を使用することです.3番目のconsole.log()とFb.api ()を別の関数で呼び出すと、FB.getLoginStatus()の内部から呼び出されます。それは動作します、ありがとう! – TomaszS

関連する問題