0

我有一个如下所示的自动完成代码。它从 ajax 成功获得正确的响应,但我不能在它下面的 grep 函数上使用响应变量。它说它是未定义的。如果我要使用全局变量,这种情况也是有效的。我怎样才能看到响应变量?

$( ".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
        });
4

1 回答 1

1

ajax是异步的。这意味着它将在加载内容之前立即继续运行您的代码(这是一件非常非常好的事情)。

您需要grep在成功函数中移动代码以及使用结果的任何其他内容。“睡眠”函数(JavaScript 中不存在这样的东西,所以我持怀疑态度)对您没有帮助,因为 JavaScript 在当前函数完成执行之前不会运行其排队的事件。这意味着ajax不可能在仍在运行您的autocomplete函数的同时完成,即使您忙于等待(无论如何,这是一件可怕的、可怕的事情)。

由于您似乎需要响应才能在source函数中返回值,因此您需要改变思考事物的方式。例如,可以在内容更改时发送请求,其success功能将触发列表项的更新。这也更具有概念意义。

于 2013-03-30T05:07:49.910 回答