Прервать запрос ajax в обещании
Я создаю проверку формы и для изучения обещаний решил реализовать асинхронные функции проверки с использованием шаблона promise:
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 отсутствует и так далее).
Теперь мне интересно, как убить запрос ajax, если проверка из предыдущего события keyup все еще продолжается. Возможно ли каким-то образом обнаружить в в каком состоянии находится обетование и возможно ли отвергнуть его извне?
1 ответ:
Отмена обещания в настоящее время находится в стадии спецификации, пока нет встроенного способа сделать это (хотя он приближается). Мы можем реализовать его сами:
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; }
Теперь мы можем убить вызовы validateAjax, вызвав
abort
на обещание:var p = validateAjax("..."); // make request p.abort(); // abort it;