【问题标题】:jQuery When, abort multiple AjaxjQuery 时,中止多个 Ajax
【发布时间】:2017-01-05 12:08:59
【问题描述】:

如何停止(中止)具有多个 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 方法不存在。

【问题讨论】:

  • $.getJSON 返回的值有中止吗?
  • $.getJSON 本身确实有一个 abort 方法,但我想要一个强大的解决方案,而不是手动将每个 $.getJSON 附加到一个变量然后一个一个中止它们..跨度>

标签: javascript jquery ajax promise


【解决方案1】:

这不是您从$.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);

【讨论】:

  • 感谢您的精彩回答。我选择了一种稍微不同的方式,但将您的答案标记为(已接受),因为它更详细。
【解决方案2】:

我最终做了:

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 方法的结果也没有公开提供给它的参数列表,因此可以直接访问它(在这种情况下会中止)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2015-07-07
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多