为什么不将angular.forEach跳过而好像在做异步操作呢?

时间:2018-12-31 17:43:23

标签: angularjs asynchronous lodash

代码

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;

问题

4myList中,但返回false。因为return语句在命中returnValue = true;之前就已命中。该代码没有执行任何异步操作,例如调用http.get。只是使用lodash.contains在大数组中查找数字。

随机观察

这仅发生在我使用源映射的环境之一中;不在我的本地计算机上。在Chrome调试器的那个环境中,代码的几行号显示为灰色,我无法在其中任何行上放置断点,但是在本地计算机上,所有行号都是黑色,因此我可以在任意一个行上放置断点他们。我的朋友认为angular.forEach是异步的,但我看不到有任何相关文档。我看了看source code,发现里面没有任何异步信号。

我做了什么

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

1 个答案:

答案 0 :(得分:1)

通过研究源代码发现

angular.forEach与您发现的异步。 需要检查的几件事:

  • 您引用myService.getBigListOfStuff()并说返回一个数组。有时会返回承诺还是任何异步信息?如果是这样,那可以解释为什么由于尚未填充而无法在列表中找到该项目。
  • 您可以验证每个列表中的类型是否匹配吗?您可能无法在列表中使用不同的注释类型(“ 4”对4),而lodash会进行严格的相等比较。

您不必担心角度问题。forEach是异步的,因为它肯定不是。如果这是在环境中发生的,则您应该能够在设置中关闭源映射并在任何位置设置断点。即使在缩小的代码中也不难找到该位置,在该代码中,当从该方法返回时returnValue(或returnValue的缩小变量)为false时,您可以设置条件断点。然后,您可以检查从服务返回的列表以及stupidArray声明。