Javascript 我怎样才能用承诺重构这个回调?
我有一段代码,可以使用facebook v1.0 API获取我的朋友列表Javascript 我怎样才能用承诺重构这个回调?,javascript,facebook-graph-api,callback,facebook-javascript-sdk,promise,Javascript,Facebook Graph Api,Callback,Facebook Javascript Sdk,Promise,我有一段代码,可以使用facebook v1.0 API获取我的朋友列表 FB.api( { method: 'fql.query', query: 'SELECT uid, name, is_app_user FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=me()) AND is_app_user=1' }, function (response) { // response contains
FB.api(
{
method: 'fql.query',
query: 'SELECT uid, name, is_app_user FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=me()) AND is_app_user=1'
},
function (response) { // response contains a list of friends
response.forEach(function(element){ // so for each friend
FB.api(
'/' + element.uid + '/friends',
function (response) { // get a list of THEIR friends
console.log(response); // and output them
}
);
});
}
);
我想重构这段代码,以使用javascript承诺和更具可读性和可维护性的.then()语法
澄清一下,我不喜欢在另一个FB.api
调用中进行FB.api
调用。特别是如果我有多个,它们可以嵌套得很深
我希望使用承诺,但我需要能够传递上一个FB.api
调用的响应
我该怎么做
理想情况下,它看起来像这样:
FB.api(
{
method: 'fql.query',
query: 'SELECT uid, name, is_app_user FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=me()) AND is_app_user=1'
},
function(response){
return response;
})
.then(function(friends){
friends.forEach(function(element){
FB.api(
'/' + element.uid + '/friends',
function (response) {
console.log(response);
}
);
});
})
首先是一个小的实用函数,用于promissfyFB.api()
//jQuery
function FB_api(options) {
return $.Deferred(function(dfrd) {
return FB.api(options, dfrd.resolve);
}).promise();
}
或
您可以类似地使用Q.js
或when.js
现在,你可以写
FB_api({
method: 'fql.query',
query: 'SELECT uid, name, is_app_user FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=me()) AND is_app_user=1'
}).then(function(response) { // response contains a list of friends
response.forEach(function(element) { // so for each friend
FB_api('/' + element.uid + '/friends').then(function (response) { // get a list of THEIR friends
console.log(response); // and output them
});
});
});
FB_api({
method: 'fql.query',
query: 'SELECT uid, name, is_app_user FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=me()) AND is_app_user=1'
}).then(function(response) { // response contains a list of friends
response.forEach(function(element) { // so for each friend
FB_api('/' + element.uid + '/friends').then(function (response) { // get a list of THEIR friends
console.log(response); // and output them
});
});
});