固定!谢谢!请参阅下面的“更正代码”.
目标是从对话框中获取数据.我看过很多文章,但是无法使用它们,所以我决定使用Web服务在对话框和底层页面之间来回传递数据.
除了读取从Web服务返回的值的代码之外,所有代码都已到位.我可以在调试器中看到数据正在被传回,但是当我返回调用者时,返回的数据是未定义的.
jQuery函数getLocal调用AJAX,返回好的数据,但是当它返回到调用它的函数(verbListShow)时,返回的值是“未定义的”.
这一切都发生在一个主要用jQuery编写的ASP.NET页面中,并打开一个jQuery对话框.
function getLocal(name) {
$.ajax({
type: "POST",async: false,url: "WebServices/FLSAService.asmx/GetLocalVariable",dataType: 'json',contentType: 'application/json; charset=utf-8',data: JSON.stringify({ name: name }),success: function (data) {
var rtn = data.d;
return rtn;
}
});
}
上面的代码可以工作,但是在调用时,rtn是未定义的.这是来电者:
function verbListShow(dutyNumber) {
$('#dlgDutyList').dialog({
modal: true,show: "slide",width: 250,height: 250,open: function (event,ui) {
setLocal("DUTYNUMBER",dutyNumber);
},buttons: {
"Select": function () {
var id = getLocal("VERBID"); // <*** Returns undefined
var verb = getLocal("VERB"); // <*** Returns undefined
$.ajax({
type: "POST",url: "WebServices/FLSAService.asmx/SetDuty",data: JSON.stringify({ dutyNum: dutyNumber,id: id,verb: verb }),success: function (data) {
data = $.parseJSON(data.d);
if (data.ErrorFound) {
showMessage(data.ErrorMessage,2,true);
}
else {
log('Set Duty: ' + data.StringReturn + ' (' + data.intReturn + ')');
}
},error: function (XMLHttpRequest,textStatus,errorThrown) {
alert("updateDuty: "
+ XMLHttpRequest.responseText);
}
});
$(this).dialog("close");
},Cancel: function () {
$(this).dialog("close");
}
}
});
$('#dlgDutyList').dialog('open');
固定代码:
function getLocal(name) {
var rtn = "";
$.ajax({
type: "POST",success: function (data) {
rtn = data.d;
}
});
return rtn;
}
解决方法
它违背了AJAX同步使用它的目的(AJAX代表Asynchronous Javascript和Xml).
现在,您无法从success方法返回值,但可以将其存储在变量中,然后返回该值
function getLocal(name) {
var returnValue;
$.ajax({
type: "POST",success: function (data) {
returnValue = data.d;
}
});
return returnValue;
}
但正确的方法是使用deferred object
function getLocal(name,resultset) {
return $.ajax({
type: "POST",success: function (data) {
resultset[name] = data.d;
}
});
}
并称之为
"Select": function() {
var results = {};
var self = this;
$.when(getLocal("VERBID",results),getLocal("VERB",results)).then(function(){
$.ajax({
type: "POST",data: JSON.stringify({
dutyNum: dutyNumber,id: results.VERBID,verb: results.VERB
}),success: function(data) {
data = $.parseJSON(data.d);
if (data.ErrorFound) {
showMessage(data.ErrorMessage,true);
}
else {
log('Set Duty: ' + data.StringReturn + ' (' + data.intReturn + ')');
}
},error: function(XMLHttpRequest,errorThrown) {
alert("updateDuty: " + XMLHttpRequest.responseText);
}
});
}).always(function(){
$(self).dialog("close");
});
}