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