清除JavaScript调用堆栈

清除JavaScript调用堆栈,javascript,backbone.js,callstack,Javascript,Backbone.js,Callstack,由于不清楚发生了什么,我制作了一个视频: 正如您所看到的,该工具在结束时崩溃,在此之前,它只是滚动并显示每个touchevent的接触点(动画圆圈)。我只想清除堆栈,这样就不会发生这种情况 我正在为一台非常慢的触摸屏计算机构建一个JavaScript工具。速度如此之慢,以至于当你用手在一小段时间(比如1秒)内触发100多个触摸事件时,计算机开始一个接一个地执行每个触摸事件 由于执行一个touchevent已经需要几百毫秒,因此该工具在大约一分钟内不可用 我已经写了这个脚本来阻止很多touch

由于不清楚发生了什么,我制作了一个视频:

正如您所看到的,该工具在结束时崩溃,在此之前,它只是滚动并显示每个touchevent的接触点(动画圆圈)。我只想清除堆栈,这样就不会发生这种情况


我正在为一台非常慢的触摸屏计算机构建一个JavaScript工具。速度如此之慢,以至于当你用手在一小段时间(比如1秒)内触发100多个触摸事件时,计算机开始一个接一个地执行每个触摸事件

由于执行一个touchevent已经需要几百毫秒,因此该工具在大约一分钟内不可用

我已经写了这个脚本来阻止很多touchevents

'use strict';

var MultiTouch = Backbone.NativeView.extend({

  el: document,

  initialize: function () {

    console.log('Init MultiTouch');

    this.el.addEventListener('touchstart', function(e) {

      this.touchstartHandler(e);

    }.bind(this));

  },

  touchstartHandler: function (e) {

    if (this.block) {

      console.log("block");
      e.preventDefault();
      e.stopPropagation();
      e.stopImmediatePropagation();
      return;

    }

    console.log("no block");
    this.startTimer();

  },

  startTimer: function () {

    this.block = true;

    setTimeout(function () {

      this.block = false;

    }.bind(this), 300);

  }

});

module.exports = MultiTouch;
这仍然无法阻止足够的事件,因为我的工具仍然很容易过载

有没有办法清空整个调用堆栈,使我的机器不会连续执行100多个函数?

谢谢

编辑

我稍微更新了脚本,并添加了两个控制台日志。这是我把手放在触摸屏上得到的:

no block MultiTouch.js:31
17 block MultiTouch.js:23
no block MultiTouch.js:31
19 block MultiTouch.js:23
no block MultiTouch.js:31
12 block MultiTouch.js:23
no block MultiTouch.js:31
20 block MultiTouch.js:23
no block MultiTouch.js:31
7 block MultiTouch.js:23
no block MultiTouch.js:31
8 block MultiTouch.js:23
no block MultiTouch.js:31
6 block MultiTouch.js:23
no block MultiTouch.js:31
9 block MultiTouch.js:23
2 no block MultiTouch.js:31
9 block MultiTouch.js:23
no block MultiTouch.js:31
7 block MultiTouch.js:23
no block MultiTouch.js:31
5 block MultiTouch.js:23
no block MultiTouch.js:31
7 block MultiTouch.js:23
no block MultiTouch.js:31
6 block MultiTouch.js:23
no block MultiTouch.js:31
11 block MultiTouch.js:23
no block MultiTouch.js:31
3 block MultiTouch.js:23
因此,将一只手放在屏幕上会触发170多个触摸事件。移动你的手会触发上千次触摸事件,这将彻底摧毁我的电脑。我怎样才能防止这种情况发生

编辑2

其中一位Anwser说,“你可以忽略大部分事件。”。事实并非如此。当成千上万的事件被称为我的计算机崩溃,所以我不能“忽略”它们

这个问题的关键是让我的电脑不会崩溃。每个touchstart都有多个函数监听,因此每个touchstart事件都会执行多个函数

由于执行这些函数需要几百毫秒,因此该工具会持续执行函数数分钟,使其无法使用

问题是,这台电脑速度太慢,以至于他只能“记住”所有输入的触摸事件,即使你一分钟前做了这件事,它仍然忙于其他事情。因此,您只需看到工具在无人触摸屏幕时自动滚动


如果仍然不清楚发生了什么,我会记录下来并把它放到网上。

你可以忽略大部分事件。 将所有相关触摸事件聚合到一个数组中,然后调用
startHandler()
。例如,您可能只需要第一个事件和最后一个事件,因此:

touchstartHandler: function (e) {

  this.events.push(e)
  this.startTimer();

},
因为您使用的是主干网,所以可以尝试
\uu0.debounce
或0.throttle
来限制调用
startHandler()`的次数

startTimer: _.debounce(function () {
 //do sth with this.events
 console.log(this.events[0])
}, 50);

尝试使用debounce,它每X毫秒只调用一次函数。立即调用使函数的第一次调用在X毫秒之前执行,非立即调用在X毫秒之后执行

以下是它的实施情况:

函数去盎司(func,wait,immediate){
var超时;
返回函数(){
var context=this,
args=参数;
var later=function(){
超时=空;
如果(!immediate)函数应用(上下文,参数);
};
var callNow=立即&&!超时;
clearTimeout(超时);
超时=设置超时(稍后,等待);
if(callNow)funct.apply(上下文,参数);
};
};
var touchEvent=函数(){
console.log('toucted');
};
var debouncedTouchEvent=去盎司(touchEvent,500,真);
对于(变量i=0;i<100000;i++){
去BouncedTouchEvent();
//将仅每500毫秒调用一次。
}
//元素。addEventListener('touch',debouncedTouchEvent)