1

是否可以在执行orjQuery.ajax()之前处理来自服务器的 JSON 响应?completeerror

或者让我扩展这个问题:

在处理 JSON 数据(每个响应属性)时,判断$.ajax()它是一个successcompleteAJAX 请求,还是一个error,所以$.ajax({error: function() {} });执行?


示例伪代码:

$.ajax({
    url: 'script.php',
    type: 'POST',
    data: {some: 'data-1'},
    dataType: 'json',
    process: function(data) {
        if(data.success == true && (data.data.length > 0)) {
            this.success = true;
        } else {
            this.success = false;
        }
    },
    success: function() {
        if( this.success == true ) {
            // it was a success
        }
    },
    error: function() {
        if( this.success == false ) {
            alert('there was an error');
        }
    }
});

为什么你可能会问?因为我想在任何地方都使用单一的$.ajax()语法,并且只$.ajax({ process: function(data) {} });应该不时更改。

4

3 回答 3

0

ajax 事件有全局事件处理程序:

$(document).ajaxComplete() //called when Ajax requests complete
$(document).ajaxError() //called when Ajax requests complete with an error
$(document).ajaxSend() //executed before an Ajax request is sent
$(document).ajaxStart() //called when the first Ajax request begins
$(document).ajaxStop() //called when all Ajax requests have completed
$(document).ajaxSuccess() 
//function to be executed whenever an Ajax request completes successfully

以及ajax设置:

$(document).ajaxSetup({
    url: 'script.php',
    type: 'POST',
    data: '{}',
    dataType: 'json'
});

然后你可以打电话:

 $.ajax({ data: myData });

它使用了以上所有内容

这是一个使用 asp.net 的示例,它发回 .d 属性并将其转换为您需要的 JSON:

$(document).ajaxSetup({
    data: "{}",
    dataType: "json",
    type: "POST",
    contentType: "application/json",
    converters: {
        "json jsond": function(msg) {
            return msg.hasOwnProperty('d') ? msg.d : msg;
        }
    },
    error: function(xhr, textStatus, errorThrown) {
        var errorMessage = "Ajax error: " + this.url
             + " : " + textStatus + " : " + errorThrown 
             + " : " + xhr.statusText + " : " + xhr.status;
        alert(errorMessage);
        if (xhr.status != "0" || errorThrown != "abort") {
            alert(errorMessage);
        }
    }
});

注意:此转换器在成功或完成之前执行 - 所以我“认为”这就是您要问的。

于 2013-03-01T14:22:23.213 回答
0

是的

function setDefaultPoint(){
    var officeId =  $('#clientTrip_officeId').val();

    $.ajax({
        url:"${createLink(controller:'clientTrip',action:'setDefaultPoint')}",
        dataType: "json",
        data: { officeId: officeId },
        success: function(data) {
            console.log(data.defaultPoint.id, data.defaultPoint.name);
            console.log(data.company.id, data.company.name);
        }

    });
}
于 2013-03-01T12:36:25.143 回答
0

简单的答案是否定的,除非您想编写自己的 JSON 解析器。

使用标准 jQuery 功能,AJAX 成功和错误处理程序将分别响应成功/不成功的数据检索而触发,而不考虑数据的正确性,除了它是格式良好的 JSON。

数据只提供给成功处理程序,所以如果你想过滤它,你必须在其中进行。

好消息是,您可以在您自己的控制下获得您寻求的那种操作$.Deferred(),在两个处理程序中的任何一个处理程序中,根据您选择的任何条件来解决/拒绝该操作。这通常在返回 Deferred 承诺的函数内完成。

代码将是这样的:

function getData() {
    var dfrd = $.Deferred();
    $.ajax({
        url: 'script.php',
        type: 'POST',
        data: {some: 'data-1'},
        dataType: 'json'
    }).done(function(data, textStatus, jqXHR) {
        if(data.success == true && (data.data.length > 0)) {
            dfrd.resolve(data, textStatus, jqXHR);
        } else {
            dfrd.reject(jqXHR, "client-side error", "data.success==false and/or data.data.length==0");
        }
    }).fail(dfrd.reject);
    return dfrd.promise();
}

因此,该函数执行您需要的额外检查,并且返回的 Promise 模拟 jqXHR 的完成/失败特征。

给返回的承诺提供 jqXHR 的全部功能需要更多的思考 - 例如。.abort()方法。

于 2013-03-01T13:10:36.310 回答