Angularjs 为什么angular.forEach会被跳过,就好像它正在执行异步操作,而实际上它不是?

Angularjs 为什么angular.forEach会被跳过,就好像它正在执行异步操作,而实际上它不是?,angularjs,asynchronous,lodash,Angularjs,Asynchronous,Lodash,代码 发行 4在myList中,但返回false。因为return语句在returnValue=true之前被命中;声明被击中了。代码没有执行任何异步操作,比如调用http.get。它只是使用lodash.contains在一个大数组中查找一个数字 随机观察 这只发生在我的一个使用源映射的环境中;不是在我本地的机器上。在Chrome调试器的环境中,代码的若干行号变灰,我不能在其中任何一行上放置断点,但在我的本地计算机上,所有行号都是黑色的,我可以在其中任何一行上放置断点。我的朋友认为它是异步的,

代码

发行

4在myList中,但返回false。因为return语句在returnValue=true之前被命中;声明被击中了。代码没有执行任何异步操作,比如调用http.get。它只是使用lodash.contains在一个大数组中查找一个数字

随机观察

这只发生在我的一个使用源映射的环境中;不是在我本地的机器上。在Chrome调试器的环境中,代码的若干行号变灰,我不能在其中任何一行上放置断点,但在我的本地计算机上,所有行号都是黑色的,我可以在其中任何一行上放置断点。我的朋友认为它是异步的,但我看不到任何这样的文档。我查看了它的目录,没有看到任何异步的内容

我所做的


我将代码更改为使用javascript for循环,在所有环境中问题都消失了。但是,开发人员到处都在使用angular.forEach,因此我们可能会在前面的循环处理之前返回值。

angular.forEach并不像您通过研究源代码发现的那样是异步的。 有几件事需要检查:

您引用myService.getBigListOfStuff并说它返回一个数组。它有时会返回一个承诺或任何异步的东西吗?如果是这样,这可以解释为什么它没有在列表中找到该项,因为它尚未填充。 您能验证每个列表中的类型是否匹配吗?您可能对列表4和列表4中的注释类型有所不同,lodash进行了严格的平等比较。 您不应该担心angular.forEach是异步的,因为它肯定不是。如果在环境中发生这种情况,您应该能够在设置中关闭sourcemaps,并在任何位置设置断点。即使在缩小的代码中也不太难找到该位置。在缩小的代码中,当returnValue或returnValue的缩小变量从该方法返回时为false时,可以设置条件断点。然后,您可以检查从服务返回的两个列表以及您的stupidArray声明。

也许myList中的值是4而不是4?@AlonEitan,正在命中returnValue=true,因此该值在列表中。它只是在底部的return语句之后被点击。谢谢。如果您只是为该函数执行console.log,您是否也会出错?可以肯定的是,在这个函数中没有任何其他的返回,对吗?
var returnValue = false;

var myList = myService.getBigListOfStuff(); // an array that contains a bunch of integers, one of which is 4

var stupidArray = [4]; // just contains the number 4

angular.forEach(stupidArray, function(myListItem){
  if(lodash.contains(myList, myListItem){
    returnValue = true;
  }
});


return returnValue;