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

jQuery Deferred として動作する $.ajax の機能を活用することで、コールバック チェーンを簡単に管理できる場合があります。

これにより、request.done(...) と request.fail(...) を装って "成功" と "エラー" の動作を内部ではなく呼び出される場所でgetTrxDatagetTrxData指定することが非常に簡単になります。チェーンの深さは (表向きは) 1 レベル低くなります。

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 に答える
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 を使用してコードをステップ実行し、変数を監視して、データが正しく入力され、どの時点でも上書きされないようにする必要があります。

あなたの制御フローは少し混乱しており、あなたができるもう1つのことは、コールバックと変数が関数であることを確認するためにいくつかのタイプの条件を使用して正しいことを確認することです。次のようなことを試してください:

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 に答える