你能解释为什么这个jQuery代码有效吗?

时间:2011-10-07 19:38:44

标签: jquery jquery-ui

我知道它有效。我已经成功实施了它。

$("#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等于标志。这看起来非常先进的代码概念,我只是欣赏这背后的理由是为了让我能够成为一个更好的编码器。

2 个答案:

答案 0 :(得分:4)

  1. 参数requestresponse将作为documented here传递给分配给source选项的函数。本质上,插件承诺将这两个参数传递给回调,这就是你如何表示你想要掌握它们的信号。

  2. 该函数是一个回调,计划在请求完成时调用,而不是在简单发送之后调用。此外,在调用getJSON时,代码会将结果对象分配给lastXhr变量,以便记住它最后一次请求。

  3. 在回调中,您可以引用以参数xhr形式完成的请求。因此if等同于写作:

    if (the request that completed is the last request made) {
        // ...
    }
    

    为什么这样?如果由于响应时间太长而无法返回且用户输入速度过快,请确保您不对请求的结果执行操作,因此您有多个未完成的请求。在这种情况下,你真的对你所做的最后一个结果不感兴趣。

    回调如何从外部作用域访问变量lastXhr?这是由于 closure

  4. 这三个等号是什么?这是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”,它涉及闭包的概念以及该语言的其他有趣方面。