处理jQuery deferred.done即使请求被中止也被调用?

时间:2013-09-11 12:54:10

标签: javascript jquery

我正在编写一个函数,它对Web服务进行http调用,获取一些数据并根据这些数据调用另一个函数。如果服务已关闭,则不应调用第二个函数。我认为这样做的显而易见的方法是编写$.when(func1()).done(func2);,但即使请求被中止,这也会触发func2。我意识到我可以通过在func1的$.getJSON方法的成功函数中调用func2来做一个解决方法,但我想尽可能使用延迟语法。任何人都可以建议如何以与延迟对象语法一致的方式处理这个问题?

function checker() {
    console.log("in checker");
    $.getJSON("http://djdjdjdjdjinvalidUrl.dkdkdk", function(data) {
        console.log("in success function");
    });
} 

function crosser(data) {
    console.log("in crosser");
}

$(document).ready(function(){
    $.when(checker()).done(crosser);
});

有关实例,请参阅jsFiddle

2 个答案:

答案 0 :(得分:7)

您需要从checker

返回承诺
function checker() {
    console.log("in checker");
    return $.getJSON("http://djdjdjdjdjinvalidUrl.dkdkdk", function(data) {
        console.log("in success function");
    });
} 

演示:Fiddle

此外,无需使用$.when()

$(document).ready(function(){
    checker().done(crosser);
});

演示:Fiddle

答案 1 :(得分:0)

对于$.getJSON等异步事件,您需要使用实际的deferred object。我已使用此对象更新了您的jsfiddle:http://jsfiddle.net/wM7aP/1/

代码:

function checker() {
    var dfd = new jQuery.Deferred();
    console.log("in checker");
    $.getJSON("http://djdjdjdjdjinvalidUrl.dkdkdk", function(data) {
        //handle data here
        dfd.resolve( "hurray" );
    });
    return dfd.promise();
} 

function crosser(data) {
    console.log("in crosser");
}

$(document).ready(function(){
    $.when(checker()).done(crosser);
});