$ .when()中的错误响应。完成()

时间:2017-01-13 05:53:38

标签: jquery ajax promise

我试图使用jquery when的例子发送几个ajax我有一个问题,因为我无法理解为什么我会生气。通常,当我尝试发送多个ajax时,响应很糟糕。

我这样做:

Workflow.prototype.ajaxWorkflowsPaymentProcessTransitionsAvailable = function (barcodes) {
        var workflow = this;
        return $.ajax({
            url: "api/v1.0/workflows/paymentProcess/transitions/available",
            type: "POST",
            data: {barcodes: barcodes},
            dataType: 'JSON'
        });
    };
Workflow.prototype.ajaxViewsDocuments = function (fd) {
        var workflow = this;

        return $.ajax({
            url: "api/v1.0/views/documents",
            type: "POST",
            data: fd,
            processData: false,
            contentType: false,
            dataType: 'JSON'
        });
    };

$.when(workflow.ajaxViewsDocuments(fd), workflow.ajaxWorkflowsPaymentProcessTransitionsAvailable(barcodes)).done(function(a1, a2){
            console.log(a1, a2);
        });

并且我在console.log中得到了这个:

enter image description here

但是服务器回复了这个:

enter image description here enter image description here

如何获得返回服务器的相同响应?

1 个答案:

答案 0 :(得分:2)

jQuery ajax返回三个结果。因此,当您使用$.when()的两个ajax调用时,传递给$.when()回调的每个参数都会传递两个数组,其中每个数组都有一个用于ajax调用的三个参数。

因此,在您的代码中更改此内容:

console.log(a1, a2);

到此:

console.log(a1[0], a2[0]);

您从jQuery ajax调用中获得的三个典型参数将在a1[0]a1[1]a2[2]中传递。返回的数据参数位于每个数组的[0]元素中。您可以在文档here中查看示例。

您可以围绕$.ajax()创建自己的包装器,该包装器将获取三个结果值,并将其修剪为一个结果值,然后$.when()不会将它们放入阵列。

// wrapper function to make return result from $.ajax() be one single argument
$.ajax2 = function() {
    return $.ajax.apply($, arguments).then(function(result) {
        // return only single result, not all three typical arguments
        // so $.when() won't put the args in an array
        return result;
    });
};

然后,你会像这样使用它(注意从$.ajax()$.ajax2()的变化):

Workflow.prototype.ajaxWorkflowsPaymentProcessTransitionsAvailable = function (barcodes) {
    var workflow = this;
    return $.ajax2({
        url: "api/v1.0/workflows/paymentProcess/transitions/available",
        type: "POST",
        data: {barcodes: barcodes},
        dataType: 'JSON'
    });
};
Workflow.prototype.ajaxViewsDocuments = function (fd) {
    var workflow = this;

    return $.ajax2({
        url: "api/v1.0/views/documents",
        type: "POST",
        data: fd,
        processData: false,
        contentType: false,
        dataType: 'JSON'
    });
};

$.when(workflow.ajaxViewsDocuments(fd), workflow.ajaxWorkflowsPaymentProcessTransitionsAvailable(barcodes)).done(function (a1, a2) {
    console.log(a1, a2);
});

我在这里用jQuery 1.x,2.x和3.x测试了这个概念:https://jsfiddle.net/jfriend00/2mcLsw3f/