voidstateとDzulqarnain Nasir のAnswers に基づいて作成した、プロジェクトで最終的に使用したコードを次に示します。
私を最もつまずかせた部分は、FB.init()
明らかに非同期であるということでした。callback()
(なしでFB.getLoginStatus
)を呼び出そうとすると、FB
まだ初期化されておらず、" An active access token must be used to query information about the current user.
" エラーが発生していました。
RequireJS シム構成
require.config({
// paths: { 'facebookSDK': '//connect.facebook.net/en_US/all/debug' }, // development
paths: { 'facebookSDK': '//connect.facebook.net/en_US/all' }, // production
shim: { 'facebookSDK': { exports: 'FB' } }
});
Facebook JS SDK を初期化する AMD モジュール
define(['facebookSDK'], function (FB) {
'use strict';
return function (settings, callback) {
var args = {
appId: settings.appId,
channelUrl: settings.channelUrl,
status: true,
cookie: true,
xfbml: true
};
console.log('Calling FB.init:', args);
FB.init(args);
if (callback && typeof (callback) === "function") {
// callback() // does not work, FB.init() is not yet finished
FB.getLoginStatus(callback);
}
};
});
これはまだ元の質問の望ましい使用法に完全には対応していません。
OPのコードは次のように書き直すことができます:
require(['libs/facebook/fb'], // where fb.js holds my above Module
function(FBinit){
FBinit({
appId: appId,
channelUrl: channelUrl
}, function(){
FB.api("/me", function(){});
});
}
);
これは、OP の元のコンセプトほどきれいではありませんが、私が把握できる最高のものです。誰かが何かを持っている場合は、私のアプローチを改善する方法についてのフィードバックやアドバイスが欲しい. 私はまだRequireJSに非常に慣れていません。