Javascript 我怎样才能用承诺重构这个回调?

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

我有一段代码,可以使用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 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);
      }
    );
  });
})

首先是一个小的实用函数,用于promissfy
FB.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
        });
    });
});