Edited at

Facebook API を $.Deferred で管理

More than 5 years have passed since last update.

複数の Facebook API を全部 $.Deferred にする

init とかの部分は略

// ログイン Deferred

var $login = $.Deferred(function ($dfd) {
FB.login(function (response) {
if (response.authResponse) {
$dfd.resolve(response);
} else {
$dfd.reject(response);
}
});
}).promise();

// FB.api の Deferred ラッパー、可変引数
function fbDfd() {

var $dfd = $.Deferred(),
args = [],
i;

for (i = 0; i < arguments.length; i++) {
args[i] = arguments[i];
}

args.push(function (response) {
if (!response || response.error) {
$dfd.reject(response);
} else {
$dfd.resolve(response);
}
});

FB.api.apply(this, args);

return $dfd.promise();
}

// ログイン後にAPIを呼び出す。 複数 API も then で連結可能
$login.then(
function (response) {
return fbDfd('/me/friends');
}
).done(function (response) {
console.log(response); // FB.api のレスポンス
});