1

我对以下代码有一个奇怪的问题:

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 具有调用者回调函数的值: alert(retorno.tipo + ": " + retorno.mensaje);

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

有任何想法吗?

谢谢

4

3 回答 3

0

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

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

于 2012-04-11T17:53:52.790 回答
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 for Firefox 来单步执行您的代码并观察您的变量,以确保数据正确输入,并且不会在任何时候被覆盖

您的控制流有点混乱,您可以做的另一件事是检查以确保您的回调和变量是正确的,使用一些 typeof 条件来确保它们是函数等。尝试这样做:

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

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

于 2012-04-11T18:02:26.290 回答
0

您可能会发现通过利用 $.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更清晰。这不是绝对必要的,代码可以重新组合而不会受到惩罚。

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

于 2012-04-11T21:53:09.873 回答