Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   foreach как узнать о завершении работы цикла? (https://javascript.ru/forum/dom-window/74975-foreach-kak-uznat-o-zavershenii-raboty-cikla.html)

DDim1000 22.08.2018 13:47

foreach как узнать о завершении работы цикла?
 
Здравствуйте!
Подскажите пожалуйста, можно ли отследить завершение работы цикла foreach? Если - да, то как это сделать?

MallSerg 22.08.2018 14:49

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

Проблема скорее всего в том что ты не понимаешь как должен работать код который ты пишешь. Например используешь асинхронные вызовы которые будут исполнены в будущем средой исполнения когда исполнение forEach уже давно завершится. Асинхронно выполняются функции таймеров (SetTimeOut) или же запрос внешних ресурсов (AJAX) и им подобные.

j0hnik 22.08.2018 15:14

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


вот та шляпа что вам нужна!

villiwalla 23.08.2018 10:37

Цитата:

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


вот та шляпа что вам нужна!

Есть ли возможность сделать break?

рони 23.08.2018 10:43

Цитата:

Сообщение от villiwalla
Есть ли возможность сделать break?

Array some

Vlasenko Fedor 23.08.2018 14:55

Цитата:

Сообщение от villiwalla
Есть ли возможность сделать break?

return
let arr = [1, 2, 3];
arr.forEach((el, i, a) => {
  if (i === 2) return;
  a[i] = el * 2
});
alert(arr.join())

Alexandroppolus 23.08.2018 15:16

Цитата:

Сообщение от Poznakomlus
return

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

вот 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())

j0hnik 23.08.2018 15:19

не только some но и find, findIndex, every

Vlasenko Fedor 23.08.2018 15:25

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())

Aetae 23.08.2018 21:07

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

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


Часовой пояс GMT +3, время: 08:06.