如果第二次调用它,我怎样才能中止javascript函数?

时间:2012-11-11 00:31:32

标签: javascript android

谷歌让我失望(这可能意味着无法完成)。

如果Javascript函数在再次被调用时仍在运行,是否有办法终止它?

情况就是这样。我有一个HTML5 Android应用程序,它具有搜索功能。当用户键入时,它会在HTML5数据库中搜索匹配项。搜索框中的每次击键都会触发一个函数来获取建议。但是因为用户输入的速度比数据库引擎更快,可以在相对较慢的设备(如我自己的,或者实际上是模拟器)上返回建议,后续的按键排队,所以建议可能需要一段时间来匹配用户键入的内容

所以我想做的是找到一些方法来杀死先前调用的getSuggestions函数,如果在完成之前再次调用它。

很容易设置一个全局功能测试在各个阶段,并在它看到它时中止,但这不会阻止在数据库引擎中堆积的查询,我猜这可能是堵塞发生的地方。这就是为什么我正在寻找一些方法来消灭整个功能。

感激地收到任何建议。感谢。

2 个答案:

答案 0 :(得分:2)

听起来像你想要underscore.js debounce method

基本上你会像这样使用它:(使用jQuery简洁)

$('#searchfield').keyup(_.debounce(getSuggestions, 250));

仅当事件未触发250 ms时,才会调用getSuggestions函数。因此,如果您正在键入,则在您暂停至少四分之一秒之前不会发生任何事情。

如何工作粘贴在下面。它围绕一个函数包含一堆逻辑并返回一个新函数。功能编程不是很有趣吗?

  // Returns a function, that, as long as it continues to be invoked, will not
  // be triggered. The function will be called after it stops being called for
  // N milliseconds. If `immediate` is passed, trigger the function on the
  // leading edge, instead of the trailing.
  _.debounce = function(func, wait, immediate) {
    var timeout, result;
    return function() {
      var context = this, args = arguments;
      var later = function() {
        timeout = null;
        if (!immediate) result = func.apply(context, args);
      };
      var callNow = immediate && !timeout;
      clearTimeout(timeout);
      timeout = setTimeout(later, wait);
      if (callNow) result = func.apply(context, args);
      return result;
    };
  };

答案 1 :(得分:1)

由于JavaScript是单线程的,因此无法中断函数执行。浏览器将简单地“冻结”直到函数返回。实际上,您甚至无法设置全局变量。

因此,您需要做的是将搜索分解成小块(例如,一次搜索1%的数据库)。确保每个部件在任何设备上执行不超过100毫秒。然后继续使用SetTimeout(getSomeMoreSuggestions,0)调用浏览器事件循环中不同部分的搜索函数。

然后,您可以检查用户是否每次在重新安排下次搜索执行之前(即在SetTimeout之前)对编辑框进行更改。