我知道这行得通。我已经成功实现了。
$("#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”?
2)以“ lastXhr =”开头的行确实令人迷惑。最后还有另一个匿名函数。我意识到这可能是回调,是在将请求发送到指定的URL后执行的。
3)匿名函数中的最后一个条件:
if ( xhr === lastXhr ) {
response( data );
}
那是什么呀?如果此匿名块中的第三个参数xhr等于.getJSON调用返回的值ENCOMPASSING此匿名块,则返回响应中的数据?
这确实是我最难缠的部分。我注意到这是3个等号。这看起来像是相当高级的代码概念,我只想知道其背后的原理是什么,以便我可以成为更好的编码器。
最佳答案
参数request
和response
将作为documented here传递给分配给source
选项的函数。从本质上讲,该插件承诺将这两个参数传递给回调,这就是您发出信号表示确实希望掌握它们的方式。
该函数是计划在请求完成时(而不是在简单发送之后)调用的回调。另外,在调用getJSON
时,代码会将结果对象分配给lastXhr
变量,以便它记住哪个是上次发出的请求。
在回调内部,您以参数xhr
的形式引用了已完成的请求。因此if
等效于编写:
if (the request that completed is the last request made) {
// ...
}
为什么这样如果由于响应时间太长而无法返回并且用户键入速度太快,您有多个未完成的请求,请确保您不对请求的结果采取任何行动。在这种情况下,您实际上对最后一次所做的任何结果都不感兴趣。
回调如何从外部作用域访问变量
lastXhr
?这是由于closure。三个等号是什么?那就是identity operator。