2012-04-11 61 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