2013-03-30 50 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函数中的值,因此您需要改变您对事物的思考方式。例如,该请求可以在内容改变时发送,并且其函数将触发列表的项目的更新。这也使得概念更具意义。