JQuery AJAX - 在.done()之前过滤

时间:2016-08-17 12:06:52

标签: javascript jquery ajax

我的应用程序有很多AJAX调用,每个调用都返回一个JSON响应。我没有验证每个.done()调用中的数据,而是试图压缩代码。

到目前为止我们有什么

$.ajax({
    url: 'test',
    type: 'GET',
    data: {
        _token: token
    },
    dataFilter: function(jsonResponse) {
        return isValidJson(jsonResponse);
    }
}).done(function(jsonResponse) {
    // do things
});

isValidJson(jsonResponse) {
    try {
        var parsedJson = $.parseJSON(jsonResponse);

        if (parsedJson.error == 1) {
            notificationController.handleNotification(parsedJson.message, 'error');

            return false;
        }
    } catch (err) {
        notificationController.handleNotification('A server-side error occured. Try refreshing if the problem persists.', 'error');

        return false;
    }

    return jsonResponse; // Have to return the original data not true
}

预期的行为是,如果dataFilter返回false,它将触发.fail(),如果返回true,则它将继续为.done()。相反,它继续使用isValidJson()的结果继续.done()。

是否还有一种方法可以使.fail()做一些标准的操作,例如向用户发送通知而不必将其置于每个AJAX调用之下?

3 个答案:

答案 0 :(得分:2)

最简单的方法是通过扩展它来为$ .ajax创建一个速记。

扩展AJAX通话

jQuery.extend({
    myAjax: function(params){
        // Here we can modify the parameters and override them e.g. making 'error:' do something different
        // If we want to add a default 'error:' callback
        params.error = function() {
            console.log('its failed');
        };

        // or you can specify data parse here
        if (params.success && typeof params.success == 'function') {
            var successCallback = params.success;
            var ourCallback = function(responseJson) {
                if (isValidJson(responseJson)) { // Validate the data
                    console.log('The json is valid');
                    successCallback(responseJson); // Continue to function
                } else {
                    console.log('The json is not valid');
                }
            }

            params.success = ourCallback;
        }

        return $.ajax(params);
    }
});

现在每次想要在应用程序中进行AJAX调用时,都不要使用$ .ajax({})。相反,您使用$ .myAjax({});

示例

$.myAjax({
    url: 'domain.com',
    type: 'GET',
    success: function(data) {
       // Do what you'd do normally, the data here is definitely JSON.
    },
    error: function(data) {}
});

这个特殊函数将以相同的方式处理所有错误,不需要每次都写出这些验证器。

答案 1 :(得分:1)

尝试这样做( Not tested ):

var jxhr = $.ajax({
    url: 'test',
    type: 'GET',
    data: {
        _token: token
    },
    dataFilter: function(jsonResponse) {        
        if (!isValidJson(jsonResponse)) {
           jxhr.abort();
        }
        return jsonResponse;
    }
}).done(function(jsonResponse) {
    // do things
});

答案 2 :(得分:1)

通过使用此策略 - 您违反"分离关注"策略。

Ajax应根据其操作解决或拒绝。如果响应是否为JSON则不符合。

可能的解决方案:(确定还有其他解决方案)

function GetSanitized(d) {
    return d.then(function(a) {
            if (a.indexOf('{') > -1) //check if json ( just for example)
                return $.Deferred().resolve(JSON.parse(a)); //return object
            else
                return $.Deferred().reject(a); //reject
        },

        function() {
            return $.Deferred().reject("ajax error"); //ajax failed
        }

    );
}

var ajax = $.Deferred();

GetSanitized(ajax) .then(function (a){alert(" Json p's value is "+a["p"]);},function (a){alert("Error"+a);});


ajax.resolve("{\"p\":2}"); //simulate ajax ok , valid json 
//ajax.resolve("\"p\":2}"); //simulate ajax ok , invalid json 
//ajax.reject("\"p\":2}"); //simulate ajax bad , valid json 

http://jsbin.com/vozoqonuda/2/edit