jquery when / then for recursive ajax calls

时间:2014-03-17 17:40:48

标签: javascript jquery ajax

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');
    });

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

感谢

2 个答案:

答案 0 :(得分:2)

Facebook JS SDK没有实现jQuery样式的promise对象/ $.Deferred,但你可以自己轻松地创建一个实例,如:

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');
    }
);

答案 1 :(得分:0)

不是一个真正的答案,而是一个演示如何实现它的工作示例:

演示JSFiddle

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);
});