Deferred.done 不执行链式进程

Deferred.done not execute chainable process

我读了 link https://api.jquery.com/deferred.done/

然后我编辑我的代码:如下

 $.ajax(
        {
            type: 'Get',
            dataType: 'json',
            data: { id: id },
            url: '@Url.Action("GetInsuranceClaim","Insurance")',
            success: function (da) {
                if (da.Message == "Success") {
                    var d = $.Deferred();
                    d.done($('#Cust_id').val(da.Result[0].customer_id), GetPolicy(), $('#policy_no').val(da.Result[0].policy_detail_id), console.log(da.Result[0].policy_detail_id));

d.done($('#Cust_id').val(da.Result[0].customer_id), GetPolicy(), $('#policy_no option').val(da.Result[0].policy_detail_id), console.log(da.Result[0].policy_detail_id));

GetPolicy() 是 ajax 调用我的问题是 ajax 调用最后执行,

我需要执行顺序

  1. $('#Cust_id').val(da.Result[0].customer_id)
    1. GetPolicy()
    2. $('#policy_no').val(da.Result[0].policy_detail_id)

Deferred.done() 的参数必须是函数。您当前的代码会立即执行这三个组件,并将三个结果提供给 done() 方法。

您应该将每个参数包装在 function() { } 中。然后 done 将按顺序调用每个函数。

似乎 GetPolicy() 最后执行。实际情况是它被称为第二个(在调用 done() 之前),它只是最后完成,因为它是异步的并且很长。

尝试下面的代码片段 - 注意 AJAX 调用中 return 的使用,使用它很重要,这样您就可以链接延迟。

注意: AJAX 调用也被延迟!

$.GetInsuranceClaim = function(){
     return $.ajax({
                type: 'Get',
                dataType: 'json',
                data: { id: id },
                url: '@Url.Action("GetInsuranceClaim","Insurance")',
});

$.GetPolicy = function(){
     //AJAX call - basically the same as the above (don't forget return)
});

$.GetInsuranceClaim().done(function(){
     $.GetPolicy().done(function(policyResponse){
          ///logic you want to do with this response
     }));
}));