gpt4 book ai didi

javascript - 回调函数内没有值的变量

转载 作者:行者123 更新时间:2023-11-28 09:55:31 25 4
gpt4 key购买 nike

我遇到了以下代码的奇怪问题:

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);

});

}

调用是这样的:

crearSelect("Default/pruebas_frarv01/trxTest",{letra:  'V'},"*",'selectID',"CustomerID",'OrderID','',function(retorno) {
alert(retorno.tipo + ": " + retorno.mensaje);
});

问题是campoTextoXX和campoValor在回调函数中没有获得任何值。另外,Chrome 中的调试显示 CampoTextoXX 具有调用者回调函数的值:警报(retorno.tipo +“:”+ retorno.mensaje);

我不知道下一步该做什么。

有什么想法吗?

谢谢

最佳答案

您可能会发现,通过利用 $.ajax 充当 jQuery Deferred 的能力,可以更轻松地管理回调链。

这使我们能够非常简单地以 request.done(...) 和 request.fail(...) 的形式指定“成功”和“错误”行为 getTrxData 被调用,而不是在 getTrxData 内部调用 - 因此回调链(表面上)深度较低。

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 中的字符串处理,看起来工作正常。

选项代码已作为单独的函数 makeOptions 取出,以使 crearSelect 的新结构更加清晰。这并不是绝对必要的,并且可以重新组合代码而不会受到惩罚。

已测试here以确保它加载并运行到“错误”警报,它成功地完成了。如果无法访问服务器端脚本,我无法测试/调试完整的 ajax 功能,因此您可能需要进行一些调试。

关于javascript - 回调函数内没有值的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10111268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com