0

私はここで困惑していて、私が何を見逃しているのか知りたいです。

私はちょうどいくつかのコードを書き直して、いくつかのものをクリーンアップしていました。ajax呼び出しを行い、json文字列を返すメソッドがあります。このメソッドを使用しているので、名前空間内でこのメソッドに抽象化した場所がいくつかあります。

これは返されたjsonオブジェクトです

{"charge_ID":"4","price":"37","description":"corporate rate"}

これは抽象化された方法です。

wwdb.getChargeRate = function( chargeID ){
    var rate = {}, prop;    
    $.post(baseUrl + 'dashboard_job/jx_get_charge_rate',
    {
        'charge_ID': chargeID
    },      
    function( data ){           
        for( prop in data) {
            rate[prop] = data[prop];            
        }       
    }, 
    'json'
    );
    return rate;
};

レートにデータを割り当てることができると思っていましたが、それを機能させるには繰り返し処理する必要がありました。実際、$。post()メソッドのfunction()部分から直接データを返すことができると思いましたが、それは機能しませんでした。では、質問1.なぜデータを返すだけではいけないのですか?

しかし、もっと基本的でイライラするのは、以下のコードではオブジェクトのプロパティにアクセスできないという事実です。質問2.それはなぜですか?

$('#charge_rate_slt').change(function(){

    var t = $(this), v = $(t).val(), rate;

    console.log(wwdb.getChargeRate( v )); //returns object ok

    rate = wwdb.getChargeRate( v ); //assigns object ok

    console.log(rate); //displays in firebug as object with properties

    console.log(rate.price) //undefined

    for(p in rate)
       console.log( p ); //undefined?
});
4

1 に答える 1

1

これは非同期であることを忘れないでください-あなたがそれを見ているとき、関数は呼び出されていません。関数がレートを返すとき、呼び出しは終了していません。後でレート変数を見ると、データがあります。コードの2番目の部分は見ていませんが、同様の問題であると思います。


この問題を理解するには、次の変更を行います。

wwdb.getChargeRate = function( chargeID ){
    var rate = {}, prop;    
    $.post(baseUrl + 'dashboard_job/jx_get_charge_rate',
    {
        'charge_ID': chargeID
    },      
    function( data ){           
        for( prop in data) {
            rate[prop] = data[prop];            
        }       
    }, 
    'json'
    );
    return { "price" : "I am not undefined" };
};

これで、呼び出し元の関数に印刷するものがあります。

于 2012-07-29T06:22:50.937 に答える