Javascript 回调函数中没有值的变量
我对以下代码有一个奇怪的问题:Javascript 回调函数中没有值的变量,javascript,jquery,callback,Javascript,Jquery,Callback,我对以下代码有一个奇怪的问题: function getTrxData(trx,inputPar,outputPar,callback) { var retorno = {}; var URL = '/XMII/Runner?Transaction=' + trx; var params = ""; for(key in inputPar) params = params + "&" + key + "=" + inputPar[key]; if(!outputPar)
function getTrxData(trx,inputPar,outputPar,callback) {
var retorno = {};
var URL = '/XMII/Runner?Transaction=' + trx;
var params = "";
for(key in inputPar)
params = params + "&" + key + "=" + inputPar[key];
if(!outputPar)
outputPar = "*";
if(params)
URL = URL + params;
URL = URL + '&OutputParameter=' + outputPar;
$.ajax({
type: "GET",
url: URL,
async: true,
success: function(data){
retorno.datos = $.xml2json(data);
retorno.tipo = 'S'; // Success
retorno.mensaje = "Datos obtenidos correctamente";
callback(retorno);
},
error: function(jqXHR, textStatus, errorThrown){
retorno.tipo = 'E'; // Error
retorno.mensaje = "Error: " + textStatus;
callback(retorno);
}
});
}
function crearSelect(trx,inputPar,outputPar,selectID,campoTextoXX,campoValor,valorDefault,callback2) {
// At this point campoTextoXX exists and has a value
getTrxData(trx,inputPar,outputPar,function(retorno2) {
// At this point campoTextoXX is an object equal to callback2
if(retorno2.tipo == 'E') {
callback2(retorno2);
return false;
}
var options = "";
var selected = "";
$.each(retorno2.datos.Rowset.Row, function(k,v) {
if(valorDefault == v[campoValor]) {
selected = " selected='selected'";
} else {
selected = "";
}
options = options + "<option value='" + v[campoValor] + selected "'>";
options = options + v[campoTextoXX];
options = options + "</option>";
});
$("#" + selectID + " > option").remove();
$("#" + selectID).append(options);
callback2(retorno2);
});
问题是campoTextoXX和campoValor在回调函数中没有得到任何值。另外,在Chrome中调试表明campoTextoXX具有调用者回调函数的值:
警报(returno.tipo+”:“+returno.mensaje)
我不知道下一步该怎么办
有什么想法吗
Thx问题似乎是您正在代码中的某个地方覆盖变量“pepe”
另外,检查如何分配回调函数和参数对象。快速查看似乎没有为其提供正确的参数 您应该小心,不要在success和error函数中使用全局变量。因此,不是:
success: function(data){
retorno.datos = $.xml2json(data);
retorno.tipo = 'S'; // Success
retorno.mensaje = "Datos obtenidos correctamente";
callback(retorno);
}
我认为你应该这样做:
success: function(data){
var retorno = {};
retorno.datos = $.xml2json(data);
retorno.tipo = 'S'; // Success
retorno.mensaje = "Datos obtenidos correctamente";
callback(retorno);
}
此外,您应该使用Firefox逐步检查代码并查看变量,以确保数据正确输入,并且在任何时候都不会被覆盖
您的控制流有点混乱,您可以做的另一件事是检查以确保回调和变量是正确的,使用一些类型的条件来确保它们是函数,等等。尝试这样做:
crearSelect("Default/pruebas_frarv01/trxTest",{letra: 'V'},"*",'selectID',"CustomerID",'OrderID','',function(retorno) {
alert(retorno.tipo + ": " + retorno.mensaje);
});
success: function(data){
var retorno = {};
retorno.datos = $.xml2json(data);
retorno.tipo = 'S'; // Success
retorno.mensaje = "Datos obtenidos correctamente";
if (typeof callback !== "function" || typeof data !== "object"){
console.log('error');
throw "callback or data is not correct type";
}
callback(retorno);
}
并确保您没有在控制台中收到错误。您可能会发现,利用$.ajax作为jQuery的功能,管理回调链会更容易 这使得我们可以非常简单地以request.done(…)和request.fail(…)的名义,在调用
getTrxData
的位置,而不是在getTrxData
内部指定“success”和“error”行为,因此回调链(表面上)不那么深
function getTrxData(trx, inputPar, outputPar) {
inputPar.Transaction = trx;
inputPar.OutputParameter = (outputPar || '*');
return $.ajax({
url: '/XMII/Runner?' + $.param(inputPar)
});
}
function makeOptions(obj, selectID, campoTextoXX, campoValor, valorDefault) {
var $option, selected, $select = $("#" + selectID);
$("#" + selectID + " > option").remove();
$.each(obj.datos.Rowset.Row, function(k, v) {
selected = (valorDefault == v[campoValor]) ? ' selected="selected"' : '';
$option = $('<option value="' + v[campoValor] + selected + '">' + v[campoTextoXX] + "</option>");
$select.append($option);
});
return obj;
}
function crearSelect(trx, inputPar, outputPar, selectID, campoTextoXX, campoValor, valorDefault, callback) {
var request = getTrxData(trx, inputPar, outputPar);
request.done(function(data) {
var obj = {
datos: $.xml2json(data),
tipo: 'S',// Success
mensaje: "Datos obtenidos correctamente"
};
callback(makeOptions(obj, selectID, campoTextoXX, campoValor, valorDefault));
});
request.fail(function(jqXHR, textStatus, errorThrown) {
var obj = {
tipo: 'E',// Error
mensaje: "Error: " + textStatus
};
callback(obj);
});
}
crearSelect("Default/pruebas_frarv01/trxTest", {letra:'V'}, "*", 'selectID', "CustomerID", 'OrderID', '', function(retorno) {
alert(retorno.tipo + ": " + retorno.mensaje);
});
函数getTrxData(trx、inputPar、outputPar){
inputPar.Transaction=trx;
inputPar.OutputParameter=(outputPar | |'*');
返回$.ajax({
url:'/XMII/Runner?'+$.param(inputPar)
});
}
函数生成选项(obj、selectID、campoTextoXX、campoValor、valorDefault){
变量$option,selected,$select=$(“#”+selectID);
$(“#”+selectID+“>option”).remove();
$.each(obj.datos.Rowset.Row,函数(k,v){
selected=(valorDefault==v[campoValor])?“selected=”selected“:”;
$option=$(''+v[campoTextoXX]+'');
$select.append($option);
});
返回obj;
}
函数crearSelect(trx、inputPar、outputPar、selectID、campoTextoXX、campoValor、valorDefault、回调){
var请求=getTrxData(trx、inputPar、outputPar);
请求完成(功能(数据){
var obj={
datos:$.xml2json(数据),
tipo:'S',//成功
门萨耶:“达托斯奥本尼多斯修正”
};
回调(makeOptions(obj、selectID、campoTextoXX、campoValor、valorDefault));
});
失败(函数(jqXHR、textStatus、errorshown){
var obj={
tipo:'E',//错误
mensaje:“错误:”+textStatus
};
回调(obj);
});
}
crearSelect(“Default/pruebas_frarv01/trxTest”、{letra:'V'}、*”、'selectID'、'CustomerID'、'OrderID'、''、函数(returno){
警报(returno.tipo+”:“+returno.mensaje);
});
您将看到,这本质上是原始代码的重构版本,大大简化了getTrxData
中的字符串处理,看起来工作正常
选项代码已作为一个单独的功能拉出,makeOptions
,以使crearSelect
的新结构更清晰。这不是严格必要的,代码可以重新组合而不受惩罚
经过测试,以确保它加载并运行到“错误”警报,并成功执行。如果无法访问服务器端脚本,我无法测试/调试完整的ajax功能,因此您可能需要进行一些调试。很抱歉,文章的调用部分出错。“佩佩”只是我在做的一个测试。它现在被编辑了,pepe只是一个字符串。变量“retrono2”定义在哪里?retrono2是一个参数,所以不需要定义。这很好,它就像一个符咒。我想我的回电做得很糟糕,但我不知道为什么。谢谢你的帮助!这是有用的,但没有帮助我解决问题。无论如何谢谢你!