Jquery 不调用.done函数时

Jquery 不调用.done函数时,jquery,promise,.when,Jquery,Promise,.when,我试图调用一个函数,该函数向用户显示一个模式窗口。我想等待答案,然后调用另一个函数来执行保存。正在调用我的初始函数,但未调用“完成”中的函数 我尝试使用settimeout和.then,但到目前为止运气不佳 function _bindProviderSectionSave() { //Provider Tab Save copyProviderService = 0; if (serviceProvider != $("#prov-ser

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

我尝试使用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(){
var dfr=$.Deferred();
app.showDecisionModal('Copy Service Provider to Service line',mg.ServiceProviderCopyWarning',Yes',No',function(){
dfr.决议(1);
},函数(){
dfr.resolve(0);
},d.close);
返回dfr.promise();
}
函数保存提供程序(foo){
console.log(foo);/1 | | 0
//…你剩下的逻辑
}
copyProvider().done(函数(值){
saveProvider(value);//值是已解析承诺中的0或1。
});
您调用
dfr.promise()
将其返回到
$.when()
,但您永远不会将
done()
的承诺解析为激发

要解决此问题,请调用
drf.resolve()
并传递所需的值,如下所示。请注意,它还有一个额外的好处,即不需要使用
copyProviderService
全局变量,因为这些值直接传递给所需的函数

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

函数copyProvider(){
var dfr=$.Deferred();
app.showDecisionModal('Copy Service Provider to Service line',mg.ServiceProviderCopyWarning',Yes',No',function(){
dfr.决议(1);
},函数(){
dfr.resolve(0);
},d.close);
返回dfr.promise();
}
函数保存提供程序(foo){
console.log(foo);/1 | | 0
//…你剩下的逻辑
}
copyProvider().done(函数(值){
saveProvider(value);//值是已解析承诺中的0或1。
});

原谅我的新问题,但我如何解决承诺?我为你添加了一个答案原谅我的新问题,但我如何解决承诺?我为你添加了一个答案顺便说一句,你应该删除
$。当(…)
包装器并调用
copyProvider()。然后(…)
当它已经返回一个承诺时,您应该在(…)包装时删除
$,只需调用
copyProvider()。然后(…)
当它已经返回承诺时