0

私のCanvasアプリ(タブページ)では、アプリが必要とする場合、次のコードを使用してAccessTokenを取得します。

var accessToken = "";
FB.getLoginStatus(function (response) {
  if (response.authResponse || response.status === 'connected') {
    accessToken = response.authResponse.accessToken;
  }else {
    alert( response.status );
  }
} ); 
return accessToken;

私は元気に働きます。ただし、ユーザーがアプリを開いて、この関数がaccessTokenを取得できなくなった後、約30分(またはそれ以下、またはそれ以上、長時間)放置すると、空の文字列で返されます。コンソールログにはエラーはありません。ユーザーがページを更新した後、すべてが正常です...

いつでもaccessTokenを取得するにはどうすればよいですか?

4

2 に答える 2

1

何が起こっているのか:

FB.getLoginStatusメソッドは非同期で実行され、終了したら実行するためのコールバックを指定します。
コードではaccessToken、非同期リクエストを発行した直後に戻りますが、完了するのを待っていません。
次のようになります。

FB.getLoginStatus(function (response) {
    if (response.authResponse || response.status === 'connected') {
        return response.authResponse.accessToken;
    } else {
        alert( response.status );
    }
});

したがって、「そもそもなぜ機能するのか」と自問するかもしれませんが、答えは簡単です。ドキュメントに記載されているように、最初はsdkに認証データがあり、実際にfbサーバーにリクエストを送信する必要はありません。メソッドの:

Facebookのサーバーへの往復

アプリケーションのパフォーマンスを向上させるために、ユーザーのステータスを確認するためのすべての呼び出しがFacebookのサーバーへの要求につながるわけではありません。可能な場合、応答はキャッシュされます。現在のブラウザセッションで初めてFB.getLoginStatusが呼び出されるか、JD SDKがstatus:trueで初期化されると、応答オブジェクトはSDKによってキャッシュされます。その後のFB.getLoginStatusの呼び出しは、このキャッシュされた応答からデータを返します。

次のように、「true」を渡してコードを試す場合は、次のようになります。

var accessToken = "";
FB.getLoginStatus(function (response) {
    if (response.authResponse || response.status === 'connected') {
        accessToken = response.authResponse.accessToken;
    } else {
        alert( response.status );
    }
}, true);
return accessToken;

その後、それはまったく機能しないはずです。

于 2012-06-05T08:39:22.593 に答える
0

このような場合はFB.loginを呼び出します。これにより、ユーザーがまだFBにログインしていて、新しいアクセス許可を要求しない場合は、ポップアップが開き、すぐに再び閉じます。

于 2012-06-05T08:35:29.280 に答える