jquery .when 不调用 .done 函数

jquery .when not calling the .done function

我正在尝试调用一个向用户显示模态 window 的函数。我想等待答案然后调用另一个函数来执行保存。我的初始函数正在被调用,但是done中的函数没有被调用。

我尝试过使用 settimeout 和 .then 到目前为止没有成功。

    function _bindProviderSectionSave() {
        //Provider Tab Save
        copyProviderService = 0;
        if (serviceProvider != $("#prov-service-prov").val() || serviceProviderSite != $("#prov-service-prov-site").val()) {
            $.when(copyProvider()).done(function () {
                saveProvider();
            });
        } else saveProvider();
    }

    function copyProvider() {
        dfr = $.Deferred();

        copyProviderService = 0;
        app.showDecisionModal('Copy Service Provider to Service Lines', mg.ServiceProviderCopyWarning, 'Yes', 'No', function () {
            copyProviderService = 1;
        }, function () {
            copyProviderService = 0;
        }, d.close);
        //return _copy;
        return dfr.promise();
    }

function saveProvider() {
        //Provider Tab Save
        var data = {};
        data.AuthPlanHeaderId = g.AuthHeaderId;
        data.RequestingProvider = $("#prov-requesting-provider").val();
        data.RequestingProviderSite = $("#prov-requesting-prov-site").val();
        data.RequestContactName = $("#prov-requesting-name").val();
        data.RequestContactPhoneEmail = $("#prov-requesting-contact").val();
        data.ServiceProvider = $("#prov-service-prov").val();
        data.ServiceProviderSite = $("#prov-service-prov-site").val();
        data.ServiceContactPhoneEmail = $("#prov-service-contact").val();
        data.Facility = $("#prov-facilityId").val();
        data.FacilitySite = $("#prov-facility-site").val();
        data.FacilityContactPhoneEmail = $("#prov-facility-contact").val();
        data.copyServices = copyProviderService;

        let ajaxSettings = {
            values: { data: data, userId: g.userId },
            url: g.appPath + '/ServiceRequest/SaveSRReviewProviders'
        };
        app.ajax(ajaxSettings).done(function () {
            _toggleTabButtons(providerTab, false);
            _toggleControls(providerTab, false);
        }); 
    }

copyProvider 函数被调用,因为模态 window 正在呈现。但是,当我单击任一模式按钮时,它只会关闭 window 而不会继续执行 saveProvider 函数。

你调用 dfr.promise() 到 return 到 $.when(),但你从未解决 done() 触发的承诺。

要解决此问题,请调用 drf.resolve() 并传递所需的值,如下所示。请注意,它具有消除对 copyProviderService 全局变量的需求的额外好处,因为值直接传递给所需的函数。

最后,正如@Bergi 所指出的,您根本不需要调用 $.when(),因为 copyProvider() return 本身就是一个承诺。试试这个:

function copyProvider() {
  var dfr = $.Deferred();
  app.showDecisionModal('Copy Service Provider to Service Lines', mg.ServiceProviderCopyWarning, 'Yes', 'No', function() {
    dfr.resolve(1);
  }, function() {
    dfr.resolve(0);
  }, d.close);
  return dfr.promise();
}

function saveProvider(foo) {
  console.log(foo); // 1 || 0
  // .. the rest of your logic
}

copyProvider().done(function(value) {
  saveProvider(value); // value is the 0 or 1 from the resolved promise.
});