javascript – 在承诺中中止ajax请求

我正在构建表单验证并学习promises我决定使用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后的超时等等).

现在我想知道如果前一个keyup事件的验证仍在进行中,如何终止ajax请求.是否可能以某种方式检测承诺在哪种状态并且可能拒绝来自外部的承诺?

解决方法

Promise取消目前正在规范中,目前还没有内置的方法(它即将推出).我们可以自己实现它:
var validateAjax = function(value) {
    // remove explicit construction: https://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;

相关文章

JS原生Ajax操作(XMLHttpRequest) GET请求 POST请求 兼容性问题 利用iframe模拟ajax 实现表单提交的返回...
AJAX 每日更新前端基础,如果觉得不错,点个star吧 😃 https://github.com/WindrunnerMax/E...
踩坑Axios提交form表单几种格式 前后端分离的开发前后端, 前端使用的vue,后端的安全模块使用的SpringSe...
很早就听闻ajax的名声,但是却一直不知道怎么用,今天自己捣鼓了一下,竟然会用了,哈哈哈哈。 为了防止...
需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: "./server/slider.js...
Ajax函数封装ajax.js // Get / Post // 参数 get post // 是否异步 // 如何处理响应数据 // URL // var...