Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以通过AJAX直接创建和使用延迟对象?_Javascript_Jquery_Ajax_Promise_Jquery Deferred - Fatal编程技术网

Javascript 是否可以通过AJAX直接创建和使用延迟对象?

Javascript 是否可以通过AJAX直接创建和使用延迟对象?,javascript,jquery,ajax,promise,jquery-deferred,Javascript,Jquery,Ajax,Promise,Jquery Deferred,我有一个应用程序,当用户单击特定按钮时,它会发送一些AJAX请求 但是,我还有一个类似于“取消”按钮的按钮,它应该中止所有请求 我正在使用$。当当前处理所有发送的请求时,在它返回的Promise对象上添加适当的回调 然而,$。当返回一个承诺对象时,由于它(故意)不包含方法延迟的事实是令人沮丧的,它必须控制请求,如下代码所示: 使用$.when var x = $.when($.get('/'), $.get('/')); // .then(function() {console.log('don

我有一个应用程序,当用户单击特定按钮时,它会发送一些AJAX请求

但是,我还有一个类似于“取消”按钮的按钮,它应该中止所有请求

我正在使用
$。当
当前处理所有发送的请求时,在它返回的
Promise
对象上添加适当的回调

然而,
$。当
返回一个
承诺
对象时,由于它(故意)不包含方法
延迟
的事实是令人沮丧的,它必须控制请求,如下代码所示:

使用$.when

var x = $.when($.get('/'), $.get('/')); // .then(function() {console.log('done');});

Object.keys(x); 
// ["state", "always", "then", "promise", "pipe", "done", "fail", "progress"]
使用一个AJAX请求(jqXHR实现延迟接口)

我正在寻找一种方法来检索
延迟的
对象,或者将
$替换为执行相同操作的方法,但返回一个
延迟的
对象。从那里,我将能够调用一个合适的拒绝/中止方法


这可能吗?

您可以将请求放入一个数组中,并在需要时分别中止它们

为此,您可以在
$上使用
.apply
。例如:

var requests = [$.get('/'), $.get('/')];
$.when.apply($,requests).then(function(res1,res2){
      //access results here
});

// aborting:
requests.forEach(function(x){ return x.abort();});
延迟对象仅用于从回调API创建承诺。无法“检索”已存在承诺的延迟对象。仅使用它创建新的


您可能还想了解Domenic的取消功能。

取消功能不在Promise/Deferred接口上,这是一种仅使用ajax的方法,需要手动处理。还请注意,jqXHR没有实现延迟接口(它没有
reject
/
resolve
方法),而是实现Promise接口。您可以像下面这样在数组中推送请求:中止请求将拒绝延迟的请求object@Bergi我明白了,谢谢你指出这一点@沃尔夫:这是我考虑过的一种可能性。它处理其他请求的方式是,它存储当前活动(单个)请求,并在请求解析之前调用
.abort
。我想我需要好好想想如何建立这个,无论如何谢谢!哦,我没看到A。沃尔夫已经提出了类似的解决方案。首先,这是他提出的一个例子。为了清楚起见,我实现了一个类似的解决方案。将来阅读本文的任何人都应该知道,在promise对象中中止一个请求将在最上面的promise对象中触发拒绝触发器。这是因为延迟对象必须成功解析其所有条件才能视为成功。如果任何一个条件失败,它将立即被视为拒绝。(但是,这不会中止其他条件的运行)
var requests = [$.get('/'), $.get('/')];
$.when.apply($,requests).then(function(res1,res2){
      //access results here
});

// aborting:
requests.forEach(function(x){ return x.abort();});