2011-01-13 13 views
0
function getUserHours(tyPe, tarGet){ 
    $.get('/activities/search', { 'type': tyPe }, 
    function(data){ 
    var hourResultData = jQuery.parseJSON(data); 
    var registeredHours = 0; 
    for (var i in hourResultData.activities){ 
     registeredHours += parseFloat(hourResultData.activities[i].hours); 
    } 
    $(tarGet).empty().append(registeredHours); 
    return registeredHours; 
    }); 

    } 

は私がしたい:あなたはAJAXの非同期GETをオフにした場合jQuery.getネストされた関数のうち、VARを取得

alert(getUserHours('r', '#reg-hours')); 

にのみ機能します直接registeredHours

答えて

1

返すデータを警告する:

$.ajax({ 
    type: 'GET', 
    url: '/activities/search', 
    data: { 'type': tyPe }, 
    async : false, 
    success : function() { } 
}); 

リクエストが完了するまでブラウザがブロックされるため、これはお勧めしません。代わりに、関数コールバックを使用して、非同期プログラミングモデルに従うことを続ける必要があります。

$.ajax({ 
    type: 'GET', 
    url: '/activities/search', 
    data: { 'type': tyPe }, 
    async : false, 
    success : function() { } 
}); 

function getUserHours(tyPe, tarGet, callback) 
{ 
    $.get('/activities/search', { 'type': tyPe }, 
    function(data) 
    { 
     var hourResultData = jQuery.parseJSON(data); 
     var registeredHours = 0; 
     for (var i in hourResultData.activities){ 
      registeredHours += parseFloat(hourResultData.activities[i].hours); 
     } 
     $(tarGet).empty().append(registeredHours); 
     if($.isFunction(callback)) 
      callback(registeredHours); 
    }); 
} 

getUserHours('r', '#reg-hours', function(hours) { 
    alert(hours); 
}); 
+0

jQuery 1.5では、新しい 'Deffered'メソッドとpromiseメソッドでこれを行ういくつかの追加方法が追加されます。 –

+0

興味深いですね、それを調べなければなりません。 – Daff

0

データの準備ができているときにから復帰しようとしているコールバック関数は、データを意味する、と呼ばれているがasyncronously送信されます。

つまり、getUserHours機能から直接データを返すことはできません。データの準備ができたら、コールするコールバック関数が必要です。このような

何か:

function getUserHours(tyPe, tarGet, callback){ 
    $.get('/activities/search', { 'type': tyPe }, 
    function(data){ 
    var hourResultData = jQuery.parseJSON(data); 
    var registeredHours = 0; 
    for (var i in hourResultData.activities){ 
     registeredHours += parseFloat(hourResultData.activities[i].hours); 
    } 
    $(tarGet).empty().append(registeredHours); 

    callback(registeredHours); // callback, send back data to callback function 
    }); 

    } 

次にgetUserHoursにパラメータとして無名関数を送信します。

getUserHours('r', '#reg-hours', function(data) { 
    alert(data); 
    }); 
関連する問題