是否可以直接使用AJAX创建和使用Deferred对象?

时间:2014-04-11 14:41:50

标签: javascript jquery ajax promise jquery-deferred

我有一个应用程序,当用户单击特定按钮时会发送一些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个对象。从那里,我将能够调用合适的拒绝/中止方法。

这可能吗?

1 个答案:

答案 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()