代码
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;
问题
4
在myList
中,但返回false。因为return
语句在命中returnValue = true;
之前就已命中。该代码没有执行任何异步操作,例如调用http.get
。只是使用lodash.contains
在大数组中查找数字。
随机观察
这仅发生在我使用源映射的环境之一中;不在我的本地计算机上。在Chrome调试器的那个环境中,代码的几行号显示为灰色,我无法在其中任何行上放置断点,但是在本地计算机上,所有行号都是黑色,因此我可以在任意一个行上放置断点他们。我的朋友认为angular.forEach
是异步的,但我看不到有任何相关文档。我看了看source code,发现里面没有任何异步信号。
我做了什么
我更改了代码以使用javascript for
循环,问题在所有环境中都消失了。但是,开发人员到处都使用过angular.forEach
,因此我们担心在返回值被之前的循环处理之前,我们可能会返回它们。
答案 0 :(得分:1)
angular.forEach与您发现的异步。 需要检查的几件事:
您不必担心角度问题。forEach是异步的,因为它肯定不是。如果这是在环境中发生的,则您应该能够在设置中关闭源映射并在任何位置设置断点。即使在缩小的代码中也不难找到该位置,在该代码中,当从该方法返回时returnValue(或returnValue的缩小变量)为false时,您可以设置条件断点。然后,您可以检查从服务返回的列表以及stupidArray声明。