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