我知道它有效。我已经成功实施了它。
$("#vehicle_application_product_id").autocomplete({
minLength: 2,
source: function(request, response) {
var term = request.term;
if (term in cache) {
response(cache[term]);
return;
}
lastXhr = $.getJSON("/products/get_json_list", request, function(data, status, xhr) {
cache[term] = data;
if (xhr === lastXhr) {
response(data);
}
});
}
});
我就像一个脚本小家伙,有一些这样的东西。我自己永远不能写这个匿名函数,原因如下:
1)这个人怎么知道把参数“request”和“response”放在spec?
中2)以“lastXhr =”开头的行真的很神秘。最后还有另一个匿名函数。我意识到这可能是一个回调,这是在请求发送到指定的URL之后执行的。
3)匿名函数中的最后一个条件:
if ( xhr === lastXhr ) {
response( data );
}
到底是什么?如果那么来自这个匿名块的第三个参数xhr等于.getJSON调用ENCOMPASSING这个匿名块返回的vaue,返回响应中的数据?
这真的是最困难的部分。我注意到3等于标志。这看起来非常先进的代码概念,我只是欣赏这背后的理由是为了让我能够成为一个更好的编码器。
答案 0 :(得分:4)
参数request
和response
将作为documented here传递给分配给source
选项的函数。本质上,插件承诺将这两个参数传递给回调,这就是你如何表示你想要掌握它们的信号。
该函数是一个回调,计划在请求完成时调用,而不是在简单发送之后调用。此外,在调用getJSON
时,代码会将结果对象分配给lastXhr
变量,以便记住它最后一次请求。
在回调中,您可以引用以参数xhr
形式完成的请求。因此if
等同于写作:
if (the request that completed is the last request made) {
// ...
}
为什么这样?如果由于响应时间太长而无法返回且用户输入速度过快,请确保您不对请求的结果执行操作,因此您有多个未完成的请求。在这种情况下,你真的对你所做的最后一个结果不感兴趣。
回调如何从外部作用域访问变量lastXhr
?这是由于 closure 。
这三个等号是什么?这是identity operator。
答案 1 :(得分:3)
1)他们在这里阅读jQuery UI Autocomplete插件的文档: http://jqueryui.com/demos/autocomplete/#option-source
2)lastXhr
看到的用法类似于getJSON的jQuery文档页面所示:http://api.jquery.com/jQuery.getJSON/
3)编写代码的人可能希望jQuery自动完成仅显示最新$.getJSON()
自动填充数据请求的结果。例如,假设我输入“abc”并自动完成火灾但我输入“d”所以它现在是“abcd” - 然后另一个自动完成触发。我们只关心“abcd”的结果,对吧?因此,检查lastXhr
是否与当前xhr
匹配!
请注意,JavaScript中的===
正在测试对象的类型是否相同且相同。在JS中,1 == '1'
为真,但1 === '1'
不是。我强烈推荐“JavaScript:The Good Parts”,它涉及闭包的概念以及该语言的其他有趣方面。