jQuery什么时候,中止多个Ajax

时间:2016-08-29 12:41:04

标签: javascript jquery ajax promise

具有多个Ajax调用的jQuery when延迟对象如何停止(中止),因此不会调用任何挂起的Ajax调用?

示例代码(最小):

var deferred = $.when(
  $.getJSON( "a.json" ),
  $.getJSON( "b.json" )
)
.done(( res )=>{
  // whatever...
});
// abort the all AJAX calls after N miliseconds
setTimeout(()=>{ deferred.abort() }, 2000);

但当然,由于deferred.abort()方法不存在,因此不能简单地执行abort

2 个答案:

答案 0 :(得分:7)

这不是您从$.when返回的承诺的一项功能。不过你可以自己写一下:(不过请参阅下面的替代方案。)

function whenWithAbort(...xhrs) {
    return {
        abort() {
            xhrs.forEach(xhr => {
               xhr.abort();
            });
        },
        promise: $.when(...xhrs)
    };
}

用法:

var ops = whenWithAbort(
  $.getJSON( "a.json" ),
  $.getJSON( "b.json" )
)
.promise.done(( res )=>{
  // whatever...
});
// abort the all AJAX calls after N miliseconds
setTimeout(()=>{ ops.abort() }, 2000);

或者实际上,更一般地说,只是一个when - with-array:

function whenPlus(...list) {
    return {
        list,
        promise: $.when(...list)
    };
}

然后:

var ops = whenWithAbort(
  $.getJSON( "a.json" ),
  $.getJSON( "b.json" )
)
.promise.done(( res )=>{
  // whatever...
});
// abort the all AJAX calls after N miliseconds
setTimeout(()=>{ ops.list.forEach(op => { op.abort() } }, 2000);

或者你可以给它一个方法来调用所有条目的命名方法:

function whenPlus(...list) {
    return {
        list,
        callOnEach(method) {
            list.forEach(entry => { entry[method]() });
        },
        promise: $.when(...list)
    };
}

然后:

var ops = whenWithAbort(
  $.getJSON( "a.json" ),
  $.getJSON( "b.json" )
)
.promise.done(( res )=>{
  // whatever...
});
// abort the all AJAX calls after N miliseconds
setTimeout(()=>{ ops.callOnEach("abort") }, 2000);

答案 1 :(得分:1)

我最终做了:

var ajaxCalls = [
    $.getJSON( "a.json" ),
    $.getJSON( "b.json" )
];

$.when(...ajaxCalls)
    .done(( res )=>{
      // whatever...
    });

// abort the all AJAX calls after N miliseconds
setTimeout(()=>{ ajaxCalls.forEach(a => a.abort()) }, 2000);

太糟糕了,when方法结果也没有公开提供给它的参数列表,因此可以直接访问(在这种情况下中止)。