Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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 合并/延迟多个子作用域$apply调用_Javascript_Angularjs_Angularjs Scope - Fatal编程技术网

Javascript 合并/延迟多个子作用域$apply调用

Javascript 合并/延迟多个子作用域$apply调用,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,在我的应用程序中,我通过HTTP通道接收数据,该通道以自定义方式处理。我正在从管道构建一些[data]对象,将它们包装在一个作用域中。$new(true),当我收到一个更新调用childScope时,$apply()设置新属性 这在轻负载下运行良好,所有的观察者都会得到通知,并且一直在运行,没有任何问题或错过更新 现在,我正试图推动更多的更新,不知道上面使用的模式是否可行。我认为(尽管没有检查)对$apply的每次调用都会调用根作用域上的摘要,我希望在浏览器周期或~50ms的间隔内合并这些摘要。

在我的应用程序中,我通过HTTP通道接收数据,该通道以自定义方式处理。我正在从管道构建一些[data]对象,将它们包装在一个作用域中。$new(true),当我收到一个更新调用childScope时,$apply()设置新属性

这在轻负载下运行良好,所有的观察者都会得到通知,并且一直在运行,没有任何问题或错过更新

现在,我正试图推动更多的更新,不知道上面使用的模式是否可行。我认为(尽管没有检查)对$apply的每次调用都会调用根作用域上的摘要,我希望在浏览器周期或~50ms的间隔内合并这些摘要。目前,每当我在5000个对象/范围上收到约100个更新时,就会关闭浏览器

我看到angular文档说每个作用域都有一个$applyAsync方法,但我在任何地方都找不到它,这基本上就是我想要的

这是一个坏主意,而且性能已经足够好了吗?我应该使用$browser.defer()或其他方法实现自己的ApplySync方法吗


编辑:刚刚测试了代码,实际上是$rootScope。为每个子作用域$apply()调用$digest。也许将此部分从Angular JS中移开并使用基于侦听器的方法会更好,因此这也是一个有效的答案。

最后我使用了evalAsync,这似乎达到了预期效果

我可能需要经常调用$digest(或$apply),以确保没有挂起的范围更改,但我还没有看到这样做的必要性

因此,我的想法是:

  • 调用evalAsync以获取所有需要快速进行的范围更改
  • 在evalAsync调用之前递增一个计数器
  • 在evalAsync函数参数内设置一个当前时间变量,并减小计数器
  • 在计时器(50-100ms)上,查看计数器是否大于0,上次计算时间是否在一段时间之前(>50-100ms),如果是,则强制执行摘要循环

我不会认为这是一个正确的答案,因为这似乎不是最好的主意,但这是我能想到的最好的主意,它按预期完成了工作。

我在想,否则我需要使用$evalAsync实现自定义$apply,这也可以实现。我想问的是,推荐的方法是什么。为了将来参考,angular中似乎已经实现了一个类似的功能: