2011-05-03 34 views
1

我正在處理一些JavaScript/jQuery代碼,這些代碼根據通過JSON請求檢索的指定用戶代理列表檢測到用戶代理。

只要發現匹配,我希望函數返回false並跳出循環,只有在沒有找到JSON文檔中的用戶代理時才繼續返回true。

我有這樣的代碼......

function checkUserAgent() { 
    $.getJSON('noapplet-useragents.json', function(data) { 
     $.each(data, function(key, val) { 
      if(navigator.userAgent.search(new RegExp(val)) != -1) { 
       console.log("False!"); 
       return false; 
      } 
     }); 
     console.log("True!"); 
     return true; 
    }); 
} 

// ... call to checkUserAgent() function 

然而,當返回false;也返回true。 如何根據需要使第一次返回停止功能。

console.log()聲明只是它們的暫時的Firebug。

編輯:感謝所有的反饋意見。由於某些原因,我無法添加評論。

+2

無法從Ajax調用返回值。閱讀:[jQuery:ajax調用成功後返回數據](http://stackoverflow.com/questions/5316697/jquery-return-data-after-ajax-call-success)另請閱讀[關於'$ .each'的文檔](http://api.jquery.com/jQuery.each/)返回false將停止迭代,但不能從回調中返回值。 – 2011-05-03 19:24:31

+0

似乎''.each'的'}'缺失。 – morgar 2011-05-03 19:26:04

+0

@morgar:不,這只是不好的縮進。 – 2011-05-03 19:27:42

回答

2

正如我在我的評論中說的you cannot return a value from an Ajax call。你必須通過一個回調:

function checkUserAgent(callback) { 
    $.getJSON('noapplet-useragents.json', function(data) { 
     var result = true; 
     $.each(data, function(key, val) { 
      if(navigator.userAgent.search(new RegExp(val)) != -1) { 
       console.log("False!"); 
       result = false; 
       return false; 
      } 
     }); 
     callback(result); 
    }); 
} 

,並稱之爲:

checkUserAgent(function(result) { 
    // so something with the result 
}); 
+0

+1,一個回調位置而不是兩個 – 2011-05-03 19:43:23

0

一個選項是你的checkUserAgent函數來處理回調。此代碼將工作:

var checkUserAgent = function(callback){ //callback is the function 
     $.getJSON('noapplet-useragents.json', function(data) {   
      $.each(data, function(key, val) {    
       if(navigator.userAgent.search(new RegExp(val)) != -1) {     
        console.log("False!");     
        callback(true);   
       } 
      }); 

      callback(false); 

}