Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 回调函数中没有值的变量_Javascript_Jquery_Callback - Fatal编程技术网

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是一个参数,所以不需要定义。这很好,它就像一个符咒。我想我的回电做得很糟糕,但我不知道为什么。谢谢你的帮助!这是有用的,但没有帮助我解决问题。无论如何谢谢你!