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

Handling jQuery deferred.done being called even though request is aborted?

本文关键字:请求 调用 jQuery deferred done 处理      更新时间:2023-09-26

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

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 获取一个实时示例。

你需要从checker返回一个承诺

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

演示:小提琴

也无需使用$.when()

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

演示:小提琴

对于像 $.getJSON 这样的异步事件,您需要使用实际的延迟对象。我已经用正在使用的这个对象更新了你的 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);
});