2013-03-30 52 views
0

我有一個像下面這樣的自動完成代碼。它從ajax成功獲得正確的響應,但是我不能在它下面的grep函數上使用響應變量。它說它沒有定義。如果我要使用全局變量,這種情況也是有效的。我怎樣才能讓它看到響應變量?自動完成的JavaScript變量範圍

$(".skl").autocomplete({ 
      source: function(req, responseFn) 
      { 
       var re = $.ui.autocomplete.escapeRegex(req.term); 
       var matcher = new RegExp("^" + re, "i"); 
       var matcher2 = new RegExp(" " + re, "i"); 

       $.ajax({ 
        type: 'POST', 
        url: "http://somepage", 
        data: { skillType: 1, skillName: re}, 
        success: function(response){ 
         console.log(response); 
        } 
       }); 

       var a = $.grep(availableTags, function(item,index){ 
        return matcher.test((item)) || matcher2.test(item); 
       }); 
       //var results = $.ui.autocomplete.filter(availableTags, req.term); 
       responseFn(a.slice(0,5)); 

      }, 

      minLength: 1, 
      autoFocus: true 
     }); 
+1

Ajax是異步的,所以您必須等待數據返回才能使用它。 – adeneo

+0

我只是在grep使用它之前添加了一個sleep函數來等待5秒鐘。沒有改變。 – gzg

回答

1

ajax是異步的。這意味着它會在加載內容之前立即繼續運行你的代碼(非常好)。

您需要將您的grep代碼以及其他任何使用結果的代碼移至成功函數中。一個「睡眠」函數(這種東西在JavaScript中不存在,所以我很懷疑)不會對你有所幫助,因爲在當前函數完成執行之前,JavaScript不會運行它的排隊事件。這意味着它是不可能阿賈克斯已經完成,同時仍然運行你的autocomplete函數,即使你忙着等待(這是一個可怕的,可怕的事情)。

由於您似乎需要響應才能返回source函數中的值,因此您需要改變您對事物的思考方式。例如,該請求可以在內容改變時發送,並且其函數將觸發列表的項目的更新。這也使得概念更具意義。