Angular的foreach循环是否异步对象?

时间:2018-01-08 12:37:56

标签: angularjs foreach

我在过去的某处读到,angular.foreach是异步的,不像是在同步的数组上循环。很长一段时间我都考虑到了这一点并做了必要的工作以避免执行循环之后的代码,直到它完成所有的迭代(通过将angular.foreach包装在一个匿名的JavaScript函数中,该函数调用一个回调函数一旦循环完成所有迭代就被执行)。

(function(callback){
  angular.foreach(..)
  callback();
})(callback)

但我与一位不同意angular.foreach是异步的同事进行了对话,而且我再也找不到那些让我感到困惑的信息。

2 个答案:

答案 0 :(得分:3)

没有。看看docs

此外,如果foreach是异步的,那么您的代码将无效。 如果foreach是异步的,那么在调用foreach后会立即调用回调,foreach会被放到eventqueue上,这将在将来的某个时间执行它。

Javascripts并发模型没有线程,而是使用eventloop。这意味着每个异步操作都会被推送到事件队列中并在以后执行。

查看MDN

答案 1 :(得分:0)

在某些情况下,您可能希望使代码异步运行。

我有一个场景,我使用本地存储来存储用户要执行相同操作的临时用户选择的工作集合。

我有一个Web服务调用,将作业名称列表转换为返回的作业对象集合。我最初尝试使用 服务层的订阅内部的foreach循环,对结果进行操作。

然后,我尝试在foreach循环中调用另一个方法,该方法在执行操作时将操作正确地发布到Web服务时从本地存储中删除了作业名称。

问题出在第二次迭代中,我再次从本地存储中读取了名称集合-在要删除的集合完成之前。

对作业和对象属性进行了很多操作,以创建在函数调用中传递的参数,因此我最终重构了代码,创建了一个值对象接口,并将整个信息存储在值对象数组中我回来的工作集。我也将作业的索引包括在值对象中。

我向类引入了BehaviourSubject属性。

在重组期间,我只是在forEach循环内向value对象数组集合添加了一个条目。在循环的结尾。我将next(0)发送到BehaviourSubject以开始滚动。

每次从本地存储中删除工作名称时,我都会转换服务以返回Promise。

然后在调用服务后的代码中,将这段代码放在行为主体subject.next(值对象+1的索引)中

在初始化中,我将行为主题设置为-1值。

然后在对BehaviourSubject类的订阅中,我忽略了-1, 并且当索引+1大于值对象集合的长度时,称为完成例程-将应用反弹到上一页。

当索引比集合大小小0到1之间时,我只是调用了原来在forEach循环中的方法,其中值对象条目的值对象与行为主体的索引匹配。

通过这样做,我已经将forEach的行为转换为异步的东西。