固定!谢谢!请参阅下面的“更正代码”.
目标是从对话框中获取数据.我看过很多文章,但是无法使用它们,所以我决定使用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"); }); }