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に関する私の最初の経験です。ありがとうございました!
私はこれを回避するために何ができますか? – TomaszS
@ TomaszS他にも解決策があります。これに関する最も一般的な方法は[Promise](https://developers.google.com/web/fundamentals/getting-started/primers/promises) – matthewninja
を使用することです.3番目のconsole.log()とFb.api ()を別の関数で呼び出すと、FB.getLoginStatus()の内部から呼び出されます。それは動作します、ありがとう! – TomaszS