Javascript 是否可以通过AJAX直接创建和使用延迟对象?
我有一个应用程序,当用户单击特定按钮时,它会发送一些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
$。当
当前处理所有发送的请求时,在它返回的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();});