变量函数中没有值的变量

时间:2012-04-11 17:50:33

标签: 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) 
    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);

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

有什么想法吗?

THX

3 个答案:

答案 0 :(得分:0)

问题似乎是你在代码中的某处覆盖变量“pepe”。

另外,请检查如何分配回调函数和参数对象。快速查看似乎没有提供正确的参数。

答案 1 :(得分:0)

您应该注意不要在成功和错误函数中使用全局变量。所以代替:

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

此外,您应该使用Firebug来逐步浏览代码并观察变量以确保数据正确输入,并且不会在任何时候被覆盖

您的控制流程有点令人困惑,您可以做的另一件事是使用某些类型的条件确保您的回调和变量是正确的,以确保它们是函数,等等。尝试这样的事情:

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

并确保您在控制台中没有收到错误。

答案 2 :(得分:0)

您可能会发现通过利用$ .ajax的行为作为jQuery Deferred的能力来管理回调链更容易。

这使我们可以非常简单地以{{1}的形式在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的新结构更清晰。这不是绝对必要的,代码可以重新组合而不会受到惩罚。

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