2012-07-20 108 views
-2

我的函數提取用戶是否被禁止,我想返回一個變量來確定彈出窗口是否顯示;但正如我發現你不能從getJSON函數返回一個變量。getJSON返回變量..解決方案?

function fetchban() { 
    $.getJSON('/fetchban.php',function(data) { 

     if(data==0) { 

      var banned = data; 
     } else { 
      $.each(data,function(index,result) { 
      $('#ban-prompt').html(result); 
      $('.popup-background').show(); 
      $('#ban-container-2').show(); 
      }); 
     } 

    }); 

    return banned; 
} 

$('.button').click(function() { 
var banned = fetchban(); 

if(banned==0) { 

//display-popup 

} 

}); 

有很多我稱之爲fetchban功能線的,所以我寧願getJSON的功能。解決辦法是什麼?

+0

那麼爲什麼你使用getJSON?使用.get() – Onheiron 2012-07-20 12:08:49

+0

可能的重複[jQuery getJSON - 將值返回給調用者函數](http://stackoverflow.com/questions/1229307/jquery-getjson-return-value-to-the-caller-function) – 2012-07-20 12:10:15

+0

或者只是在JSON中設置禁止標誌,如{banned:「false」,數據:{...你的常規對象}},然後去var禁止= data.banned – Onheiron 2012-07-20 12:10:34

回答

3

你的功能有兩個問題。

第一個也是最重要的是假定getJSON是同步的。它默認爲異步,這意味着根據檢索的數據,fetchban返回是不可能的。相反,fetchban應接受它調用的回調和結果。

第二(一旦你解決第一個將反正走),是你想從一個沒有聲明fetchban返回一個變量(因爲你把它聲明getJSON成功處理程序)。

所以,你會改變fetchban看起來是這樣的:

function fetchban(callback) { 
    $.getJSON('/fetchban.php',function(data) { 
     var banned; 

     // ...figure out what `banned` should be from the `data`, 
     // I'm afraid I couldn't make sense of the code, looked 
     // like it always set `banned` to 0. 

     // Call the callback with the result 
     callback(banned); 
    }); 
} 

然後,而不是

$('.button').click(function() { 
    var banned = fetchban(); 

    if(banned==0) { 
     //display-popup 
    } 
}); 

做到這一點:

$('.button').click(function() { 
    fetchban(function(banned) { 
     if(banned==0) { 
      //display-popup 
     } 
    }); 
}); 

...或好多了,請稍早取得,已有click到達時的信息。用戶點擊時不喜歡延遲,甚至是網絡往返中的最佳情況對於人類來說都是顯而易見的。

+0

我該怎麼做「fetchban應該接受一個回調調用結果」? – user892134 2012-07-20 12:14:09

+0

@ user892134:查看更新。或者網上約757,521個回調教程和示例中的任何一個。 ;-) – 2012-07-20 12:14:35