繁体   English   中英

jQuery .when不调用.done函数时

[英]jquery .when not calling the .done function

我正在尝试调用向用户显示模式窗口的函数。 我想等待答案,然后调用另一个函数执行保存。 我的初始函数被调用,但完成的函数未被调用。

到目前为止,我还没有尝试使用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函数。 但是,当我单击任何一个模式按钮时,它只是关闭窗口,而不继续进行saveProvider函数。

您调用dfr.promise()将其返回到$.when() ,但您从未解决过将done()触发的承诺。

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

最后,正如@Bergi指出的那样,您根本不需要调用$.when() copyProvider() ,因为copyProvider()本身会返回一个promise。 尝试这个:

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.
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM