Javascript 在承诺中中止ajax请求
我正在构建表单验证,为了了解承诺,我决定使用承诺模式实现异步验证函数:Javascript 在承诺中中止ajax请求,javascript,ajax,promise,cancellation,Javascript,Ajax,Promise,Cancellation,我正在构建表单验证,为了了解承诺,我决定使用承诺模式实现异步验证函数: var validateAjax = function(value) { return new Promise(function(resolve, reject) { $.ajax('data.json', {data: {value: value}}).success(function(data, status, xhr) { if (data.valid) {
var validateAjax = function(value) {
return new Promise(function(resolve, reject) {
$.ajax('data.json', {data: {value: value}}).success(function(data, status, xhr) {
if (data.valid) {
resolve(xhr)
}
else {
reject(data.message)
}
}).error(function(xhr, textStatus) {
reject(textStatus)
})
})
}
//...
var validators = [validateAjax];
$('body').delegate('.validate', 'keyup', function() {
var value = $('#the-input').val();
var results = validators.map(function(validator) {
return validator(input)
});
var allResolved = Promise.all(results).then(function() {
//...
}).catch(function() {
//...
})
});
这似乎工作正常,输入被验证为用户类型(代码被简化为不太长,例如缺少keyup后超时等等)
现在我想知道,如果上一个keyup事件的验证仍在进行中,如何终止ajax请求。是否有可能检测到承诺处于哪种状态,并可能拒绝来自外部的承诺?承诺取消目前正在规范中,目前还没有内置的方法来实现这一点(尽管即将实现)。我们可以自己实施:
var validateAjax = function(value) {
// remove explicit construction: http://stackoverflow.com/questions/23803743
var xhr = $.ajax('data.json', {data: {value: value}});
var promise = Promise.resolve(xhr).then(function(data){
if(!data.isValid) throw new Error(data.message); // throw errors
return data;
});
promise.abort = function(){
xhr.abort();
});
return promise;
}
现在,我们可以通过调用promise上的abort
来终止validateAjax调用:
var p = validateAjax("..."); // make request
p.abort(); // abort it;
太好了,我明白了,谢谢你的回答。无论如何,关于删除显式构造-xhr仍然需要从validateAjax函数返回,对吗?validateAjax返回未定义-是否缺少一行?@LukasKral-我认为需要返回var
promise
,因为它有.abort
函数-但我没有编写代码,所以我只能推测这是个好主意。不幸的是,该函数将在链中丢失。所以var p=validateAjax(…)。然后(…);p、 中止();//没有这样的功能对,它不会连锁。