Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery自动完成太多数据库请求_Javascript_Jquery_Ajax_Database_Autocomplete - Fatal编程技术网

Javascript jQuery自动完成太多数据库请求

Javascript jQuery自动完成太多数据库请求,javascript,jquery,ajax,database,autocomplete,Javascript,Jquery,Ajax,Database,Autocomplete,在jQueryAjax自动完成小部件中使用db数据时,如何解决对数据库的请求过多的问题?基本上,每次用户插入一封信时,脚本都会向数据库发出ajax请求,将db请求降至最低的最佳做法是什么 我从第三方应用程序获得数据,所以我必须考虑它可以在我的应用程序中改变。< /强> < p>你可以节制或去抖动请求。这些函数通常包含在像Lodash()这样的库中 去抖动:当按下一个键时,计时器启动。当计时器结束时,进行Ajax调用。在定时器期间按下另一个键时,定时器复位 油门:当按下一个键时,会发出一个Aj

在jQueryAjax自动完成小部件中使用db数据时,如何解决对数据库的请求过多的问题?基本上,每次用户插入一封信时,脚本都会向数据库发出ajax请求,将db请求降至最低的最佳做法是什么


<强>我从第三方应用程序获得数据,所以我必须考虑它可以在我的应用程序中改变。< /强>

< p>你可以节制或去抖动请求。这些函数通常包含在像Lodash()这样的库中

去抖动:当按下一个键时,计时器启动。当计时器结束时,进行Ajax调用。在定时器期间按下另一个键时,定时器复位


油门:当按下一个键时,会发出一个Ajax调用并启动一个计时器。当定时器运行时按下另一个键时,该键将被忽略

几个月前我也有同样的问题。
我找到了两种解决方案:

解决方案1:
不要从键入的第一个字母开始查询。使用“minLength”自动完成属性。添加该属性后,第一个查询将从n开始,其中n是以前键入的字母数(整数)。
例如:

$( ".selector" ).autocomplete({
    minLength: 3
});
$( ".selector" ).autocomplete({
    delay: 500
});
解决方案2:
在多次发送之间添加延迟(非常短,但对数据库来说很好)。像250/300/500毫秒这样的短时间(取决于你和数据库之间的ping,或者用户带宽)是非常可观的。值的单位为毫秒(整数)。
例如:

$( ".selector" ).autocomplete({
    minLength: 3
});
$( ".selector" ).autocomplete({
    delay: 500
});
我希望它能满足您的需要。

不要犹豫同时使用这两种方法。

正如@Remq所说,您可以试试这个

  $("your_selector").autocomplete({
     source: debounce(querySourceData, 1000),
  });

  function debounce(fn, delay) {
    var timer;
    return function() {
      var args = [].slice.call(arguments);
      var context = this;
      if (timer) {
        window.clearTimeout(timer);
      }
      timer = window.setTimeout(function() {
        fn.apply(context, args);
      }, delay);
    };
  };

  function querySourceData(request, response) {
     $.ajax({
        url: '/your_api',
        success: function(data = []) {
           response(data);
        },
        error: function() {
           response([]);
        }
     });
  }

您可以使用jquery autocomplate的minLength属性。为什么不试试Scrollable呢?例如:+1,用于教授与问题相关的新概念。很抱歉没有接受你的回答。你和@Aethyn的回答对我都很有用。