2012-04-11 62 views
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);

我不知道接下来要做什么。

任何想法?

THX

回答

0

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

这让我们很简单地在哪儿getTrxData被称为点指定request.done(...)和request.fail(...)的幌子的“成功”和“错误”行为而不是在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功能,因此您可能需要进行一些调试。

+0

这很棒,它的功能就像一个魅力。我想我很糟糕的做了回调,但我不知道为什么。谢谢你的帮助! – 2012-04-12 14:35:29

0

的问题似乎是,你在你的代码重写变量“佩佩”的地方。

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

+0

很抱歉,帖子的通话部分是错误的。 “佩佩”只是我正在做的一项测试。它现在被编辑,佩佩只是一个字符串。 – 2012-04-11 18:00:44

+0

变量“retorno2”的定义在哪里? – Jlange 2012-04-11 18:03:28

+0

retorno2是一个参数,所以不需要定义。 – 2012-04-12 17:55:26

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为Firefox逐步执行代码,看你的变量,以确保数据在未来正确,并没有被覆盖在任何点

您的控制流是有点混乱,你可以做的另一件事是检查以确保你的回调和变量是正确的使用某些类型的条件,以确保它们是功能等尝试做这样的事情:

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

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

+0

这是有用的,但没有帮我解决问题。不管怎么说,还是要谢谢你! – 2012-04-12 17:54:41