Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.08.2018, 13:47
Профессор
Отправить личное сообщение для DDim1000 Посмотреть профиль Найти все сообщения от DDim1000
 
Регистрация: 20.10.2016
Сообщений: 223

foreach как узнать о завершении работы цикла?
Здравствуйте!
Подскажите пожалуйста, можно ли отследить завершение работы цикла foreach? Если - да, то как это сделать?
Ответить с цитированием
  #2 (permalink)  
Старый 22.08.2018, 14:49
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Нет такого ключевого слова как «foreach» следовательно и цикла цикла «foreach» существовать не может.
Зато в прототипе предопределенного базового типа Array реализован метод forEach как и любой другой метод(функция объекта) он завершает свою работу возвращением результата.
Любой код написанный после вызова метода forEach будет исполнятся только после завершения вызова forEach и никак иначе.

Проблема скорее всего в том что ты не понимаешь как должен работать код который ты пишешь. Например используешь асинхронные вызовы которые будут исполнены в будущем средой исполнения когда исполнение forEach уже давно завершится. Асинхронно выполняются функции таймеров (SetTimeOut) или же запрос внешних ресурсов (AJAX) и им подобные.
Ответить с цитированием
  #3 (permalink)  
Старый 22.08.2018, 15:14
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

[1,2,3].forEach((el,i,arr)=>{
	//некий код
	if(i == arr.length-1) console.log('Метод кончается!');
});


вот та шляпа что вам нужна!
Ответить с цитированием
  #4 (permalink)  
Старый 23.08.2018, 10:37
Аватар для villiwalla
Интересующийся
Отправить личное сообщение для villiwalla Посмотреть профиль Найти все сообщения от villiwalla
 
Регистрация: 16.02.2016
Сообщений: 29

Сообщение от j0hnik Посмотреть сообщение
[1,2,3].forEach((el,i,arr)=>{
	//некий код
	if(i == arr.length-1) console.log('Метод кончается!');
});


вот та шляпа что вам нужна!
Есть ли возможность сделать break?
Ответить с цитированием
  #5 (permalink)  
Старый 23.08.2018, 10:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Сообщение от villiwalla
Есть ли возможность сделать break?
Array some
Ответить с цитированием
  #6 (permalink)  
Старый 23.08.2018, 14:55
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от villiwalla
Есть ли возможность сделать break?
return
let arr = [1, 2, 3];
arr.forEach((el, i, a) => {
  if (i === 2) return;
  a[i] = el * 2
});
alert(arr.join())
Ответить с цитированием
  #7 (permalink)  
Старый 23.08.2018, 15:16
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Poznakomlus
return
это никакой не break, а лишь проверка на каждой итерации.
(я как-то сначала даже подумал, что return в стрелочных функциях тоже "внешний" )

вот some - тут действительно есть break, цикл дальше не едет

var arr = [1, 2, 3, 4, 5];
arr.some((el, i, a) => {
  if (i === 2) return true;
  a[i] = el * 2
});
alert(arr.join())
Ответить с цитированием
  #8 (permalink)  
Старый 23.08.2018, 15:19
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

не только some но и find, findIndex, every
Ответить с цитированием
  #9 (permalink)  
Старый 23.08.2018, 15:25
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Alexandroppolus,
совершенно правильно. для эмуляции break в цикле, вам достаточно выкинуть ошибку и выше ее перехватить
var arr = [1, 2, 3];
try {
  arr.forEach((el, i, a) => {
    if (i === 1) {
      throw 'break'
    }
    a[i] = el * 2
  });
} catch (e) {
  console.log(e)
}
alert(arr.join())
Ответить с цитированием
  #10 (permalink)  
Старый 23.08.2018, 21:07
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Poznakomlus, ну это уж совсем...

Если уж очень хочется foreach, то можно юзать for of(предварительно обмазавшись всякими бабелами):
for(let value of array){
    //...
}
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как мне узнать почту wepogar Оффтопик 11 21.06.2018 12:58
Как узнать какой скрипт вызывается при клике по эленету (если это прямо не прописано) Dmitriy Komar Events/DOM/Window 4 08.12.2011 17:21
Массивы. Как узнать ключ, зная значение? jsuse Общие вопросы Javascript 4 24.11.2011 19:03
Как узнать подключен ли JavaScript у пользователя? frost18 Элементы интерфейса 1 26.10.2011 17:16
Как узнать текущее значение TreePanel? astral_sight ExtJS 3 23.07.2010 13:03