Javascript jquery when/then用于递归ajax调用

Javascript jquery when/then用于递归ajax调用,javascript,jquery,ajax,Javascript,Jquery,Ajax,我想确保fb调用在then()块执行但没有机会执行时完成。有没有办法实现这一点 感谢Facebook JS SDK没有实现jQuery风格的promise对象/$。延迟s,但您可以自己轻松创建一个实例,如: function getFriends(url) { return FB.api(url, function(response) { if (response && !response.error) { if (response

我想确保fb调用在then()块执行但没有机会执行时完成。有没有办法实现这一点


感谢

Facebook JS SDK没有实现jQuery风格的promise对象/
$。延迟
s,但您可以自己轻松创建一个实例,如:

function getFriends(url) {
    return FB.api(url, function(response) {
        if (response && !response.error) {
            if (response.paging && response.paging.next) {
                $.each(response.data, function() {
                    friends.push(this);
                });
                return getFriends(response.paging.next);
            } else {
                console.error(friends);
            }
        } else {
            console.error("facebook friends couldn't been retrieved ");
        }
    });
}

$.when(getFriends("/me/friends")).then(
    function() {
        console.log('getFriends finished');
    });

这不是一个真正的答案,而是一个演示如何进行的工作示例:

演示


FB.api()
是否返回承诺对象?如果没有,则不能将其与
$一起使用。当
时,FBAPI调用可能不会返回jQuery样式的延迟/承诺对象。实例化您自己的
$。在函数中延迟
,返回实例并在FB API调用的回调中手动解析。不依赖于jQuery,因此不返回承诺对象。因此,当您将
getFriends
的响应传递给
$时,
然后
回调会立即被调用。虽然“then”的意思是“做这个”和“然后”做那个,但实际上它是不推荐的另一种形式,您可以更改延迟的解析和拒绝调用中传递的内容。在上面的示例中,如果您添加了一个“done”,则回调将被调用为undefined,即:
。然后(…).done(函数(x){})
(x未定义)总之,最好使用.done代替。然后(除非您真的想更改承诺中“返回”的内容)@Rui+1,我只是不想通过更改内容来增加太多的混乱,但我想我现在会这么做,因为你完全正确。@m90我按照你说的做了尝试,但这次完成()部分没有执行。它在你的控制台中记录了什么?一个错误还是朋友列表?好吧,我明白了。我想递归创建延迟对象是主要问题。现在,我创建了一个延迟对象,并将其传递给
getFriends
方法。它正在工作!
function getFriends(url) {
    var dfd = $.Deferred();
    FB.api(url, function(response) {
        if (response && !response.error) {
            if (response.paging && response.paging.next) {
                $.each(response.data, function() {
                    friends.push(this);
                });
                return getFriends(response.paging.next);
            } else {
                console.log(friends);
            }
            dfd.resolve();
        } else {
            console.error("facebook friends couldn't been retrieved ");
            dfd.reject();
        }
    });
    return dfd;
}

getFriends("/me/friends").done(
    function() {
        console.log('getFriends finished');
    }
);
function doStuff() {

    var dfd = new jQuery.Deferred();
    alert ("loaded");
    setTimeout(function(){
        dfd.resolve("response - success");
    }, 5000);
    return dfd.promise();

}


$.when(doStuff()).then(function(status) {
    alert(status);
});