我有一个应用程序,当用户单击特定按钮时会发送一些AJAX请求。
但是,我也有类似于'取消'按钮,应该中止所有请求。
我目前正在使用$.when
处理所有已发送的请求,并在其返回的Promise
对象上添加了适当的回调。
然而,$.when
返回Promise
对象的事实令人沮丧,因为它没有(故意)包含Deferred
必须控制请求的方法,如图所示使用此代码:
使用$ .when
var x = $.when($.get('/'), $.get('/')); // .then(function() {console.log('done');});
Object.keys(x);
// ["state", "always", "then", "promise", "pipe", "done", "fail", "progress"]
使用一个AJAX请求(jqXHR实现Deferred接口)
var x = $.get('/');
Object.keys(x);
// ["readyState", "getResponseHeader", "getAllResponseHeaders", "setRequestHeader", "overrideMimeType", "statusCode", "abort", "state", "always", "then", "promise", "pipe", "done", "fail", "progress", "complete", "success", "error"]
我正在寻找一种方法来检索Deferred
对象,或者使用执行相同操作的方法替换$.when
,但却返回Deferred
个对象。从那里,我将能够调用合适的拒绝/中止方法。
这可能吗?
答案 0 :(得分:1)
您可以将请求放入数组中,并在需要时单独中止。
为此,您可以.apply
使用$.when
。例如:
var requests = [$.get('/'), $.get('/')];
$.when.apply($,requests).then(function(res1,res2){
//access results here
});
// aborting:
requests.forEach(function(x){ return x.abort();});
延迟对象仅用于从回调API创建promise。你不能检索'已存在的承诺的延迟对象。只使用它创建新的。
您可能还想查看Domenic的last()
。