2012-03-23 27 views
-2

以下のコードでは、 'one'と 'two'を警告する必要があります。 .buttonを押すと、「1」だけが警告されます。 var got.button関数に返されていません。あなたの変数gotが非同期的に(すなわち、あなたはJSONコールバック関数の外でそれにアクセスすることはできません)あなたのJSONのリターン機能にスコープ、プラスJSONロードされるためだ戻り値jquery関数

$('.button').live('click',function() { 
var got = fetchvalue('100'); 

    if(got==1) { 
    alert('two'); 

    } 

}); 


function fetchvalue(id) { 

    $.getJSON('/fetchvalue.php?id='+id+'&w=1',function(data) { 

alert('one');  
    var got=1;     

    }); 

    return got; 
} 

答えて

0

。 $ .ajax呼び出しを使用してasyncをfalseに設定することもできます。これは同じ効果を持ちますが、非同期読み込みがないため、コールバック内で設定した変数は(有効に)スコープされません。

function fetchvalue(id) { 
    var got; 
    $.ajax({ 

     url: '/fetchvalue.php?id=' + id + '&w=1', 
     dataType: 'json', 
     async: false, 
     data: myData, 
     success: function(data) { 
      alert('one'); 
      got = 1; 
     } 
    }); 

    return got; 
}​ 
+0

これはgetJSONで関数として動作しません。 ajax呼び出しが完了すると、呼び出しは非同期に呼び出されます。これは、元のコードの問題の1つです。 – joshuahealy

+0

あなたのコメントを反映するよう編集しました。これを指摘してくれてありがとうございます。 –

5

getJSONこの呼び出し文で、すぐに戻り値を取得することは不可能なので、あなたのコードがなければならないことを意味し、非同期、次のとおりです。

$('.button').live('click',function() { 
    fetchvalue('100', function(got) { // add a callback 
     if (got == 1) { 
      alert('two'); 
     } 
    }); 
}); 


function fetchvalue(id, callback) { 
    $.getJSON('/fetchvalue.php?id='+id+'&w=1',function(data) { 
     alert('one');  
     var got=1; 
     callback(got); // invoke the callback 
    }); 

    // no return is required 
} 
+0

http://api.jquery.com/live/ "jQuery 1.7以降では、.live()メソッドは廃止予定です。イベントハンドラをアタッチするには.on()を使用してください。古いバージョンのjQueryを使用する場合は、.delegate ()を.live() "に優先して使用します。 – Jayanga

+0

ありがとうございました。あなたは私の時間を救った.. –