Javascript:创建一个类似于缓冲区的对象,该对象收集输入击键,然后以定时间隔将它们逐个释放到函数中

Javascript:创建一个类似于缓冲区的对象,该对象收集输入击键,然后以定时间隔将它们逐个释放到函数中,javascript,input,buffer,delay,timing,Javascript,Input,Buffer,Delay,Timing,我试图创建一个类似缓冲区的对象,它收集输入字段中的所有击键,然后将它们逐个传递给函数,每个函数之间有一个设置的定时延迟 例如,当使用Google Maps/Places Autocomplete服务API时,输入字段中的每次击键都会触发Autocomplete的请求函数,我发现如果在很短的时间内击键过多,Autocomplete请求将无法返回结果。因此,我想创建一种缓冲区来收集所有击键,然后以200ms的间隔将它们逐个释放到Autocomplete函数 所以输入123个伪St需要700ms,然后

我试图创建一个类似缓冲区的对象,它收集输入字段中的所有击键,然后将它们逐个传递给函数,每个函数之间有一个设置的定时延迟

例如,当使用Google Maps/Places Autocomplete服务API时,输入字段中的每次击键都会触发Autocomplete的请求函数,我发现如果在很短的时间内击键过多,Autocomplete请求将无法返回结果。因此,我想创建一种缓冲区来收集所有击键,然后以
200ms的间隔将它们逐个释放到Autocomplete函数

所以输入123个伪St需要700ms,然后以200ms的间隔将字符串的每个字符传递给函数-1(200ms)2(200ms)3(200ms)F(200ms)a。。。ect

目前我对如何编写这样的东西还没有明确的想法,因此无法发布代码,但我会认为这将是一个类似于

On key press:

    if( (lastRequestTime - 200) > curTime )
        send input to function

然而,这显然远未完成。有人想过如何实现这一点吗?

您需要在输入上使用onkeydown事件(如您所示)。或者在某些浏览器中,您可能需要将事件放置在主体上,然后等待元素上的焦点事件。我能给出的一点主要智慧是关于计时模式。您应该设置一个队列对象,该对象接收密钥并处理发送密钥的操作。基本上,它应该在创建时将一个名为“ready”的bool设置为true,然后每当它得到一个新密钥时,如果它准备好了,它就会立即发送它。但如果不是,它将把它添加到队列中(通常是一个数组)。无论何时,只要让它发送一个键,只要让它设置一个超时,如果有一个键在那里,它就会触发另一个发送(在队列上的下一个键上),或者只是将其设置为true

警告:不是技术上有效的javascript。主要是一个例子

takeKey( key )
{
  if ( this.ready )
    this.sendIt( key );
  else
    this.queue.push( key );
}

sendIt ( key )
{
  this.ready = false;
  send( key );
  timeout(function () {
    this.readyUp();    
  }, time);
}

readyUp ()
{
  ready = true;
  if (this.queue.length > 0)
    this.sendIt( this.queue.shift() );
}
这应该能解决你的时间问题。剩下的只是基本的dom编码


另外,检查一个叫做throttle的东西是你的autocomplete小部件的文档。解决方案可能会立即生效。

为什么不在每次击键时重置一个setTimeout呢?然后,一旦它过期,您就知道在您指定的时间间隔内没有按下任何键。那将是启动/显示自动完成的好时机。