Почему angular.forEach должен быть пропущен, как если бы он выполнял асинхронный вызов, если это не так? - PullRequest
0 голосов
/ 31 декабря 2018

Код

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 асинхронным, но я не вижу никакой документации на этот счет.Я посмотрел на исходный код для него и не вижу там ничего асинхронного.

Что я сделал

Я изменилкод для использования цикла javascript for, и проблема исчезла во всех средах.Тем не менее, разработчик использовал angular.forEach повсеместно, поэтому есть проблема, что мы можем возвращать значения до того, как они были обработаны предыдущими циклами.

1 Ответ

0 голосов
/ 31 декабря 2018

angular.forEach не является асинхронным, как вы выяснили, изучая исходный код.Несколько вещей для проверки:

  • Вы ссылаетесь на myService.getBigListOfStuff () и говорите, что возвращает массив.Это иногда возвращает обещание или что-то асинхронное?Если это так, это может объяснить, почему он не находит элемент в списке, поскольку он еще не заполнен.
  • Можете ли вы проверить соответствие типов в каждом из списков?В ваших комментариях могут быть разные типы («4» против 4), и lodash проводит строгое сравнение на равенство.

У вас не должно быть беспокойства по поводу мышления angular.forEach isasync, как это, безусловно, нет.Если это происходит в среде, вы должны иметь возможность отключить исходные карты в своих настройках и устанавливать точки останова в любом месте.Расположение не должно быть слишком сложным, чтобы найти его даже в минимизированном коде, где вы можете установить условную точку останова, когда returnValue (или минимизированная переменная для returnValue) ложно при возвращении из этого метода.Затем вы можете проверить оба списка, возвращенных службой, а также объявление stupidArray.

...