Курсы javascript
Здравствуйте!
Подскажите пожалуйста, можно ли отследить завершение работы цикла foreach? Если — да, то как это сделать?
22.08.2018, 15:49
Регистрация: 07.03.2011
Сообщений: 1,123
Нет такого ключевого слова как «foreach» следовательно и цикла цикла «foreach» существовать не может.
Зато в прототипе предопределенного базового типа Array реализован метод forEach как и любой другой метод(функция объекта) он завершает свою работу возвращением результата.
Любой код написанный после вызова метода forEach будет исполнятся только после завершения вызова forEach и никак иначе.
Проблема скорее всего в том что ты не понимаешь как должен работать код который ты пишешь. Например используешь асинхронные вызовы которые будут исполнены в будущем средой исполнения когда исполнение forEach уже давно завершится. Асинхронно выполняются функции таймеров (SetTimeOut) или же запрос внешних ресурсов (AJAX) и им подобные.
22.08.2018, 16:14
Регистрация: 01.12.2016
Сообщений: 3,650
[1,2,3].forEach((el,i,arr)=>< //некий код if(i == arr.length-1) console.log('Метод кончается!'); >);
вот та шляпа что вам нужна!
Как можно выйти из цикла foreach js
В JavaScript цикл forEach не имеет стандартного способа выйти из него до его завершения. Как уже упоминалось, оператор break не работает в цикле forEach . Однако, можно использовать исключения (throw) для выхода из цикла.
Пример кода, который использует исключения для выхода из цикла forEach :
const array = [1, 2, 3, 4, 5]; let isValueFound = false; try array.forEach(function (element) if (element === 3) isValueFound = true; throw new Error('Value found'); > >); > catch (e) if (e.message !== 'Value found') throw e; > > if (isValueFound) console.log('Value is found'); > else console.log('Value is not found'); >
Однако, использование исключений может сделать код менее читаемым и более сложным в отладке, поэтому использование исключений для управления потоком программы следует ограничивать только крайними случаями.
Выйти из цикла forEach

Выйти из цикла while в игре «Угадай число»
Добрый день! У vtyz возник вопрос по игре "угадай чило". Написала код, работает хорошо, НО, не.

Как выйти из цикла foreach
Как досрочно выйти из цикла foreach?
Выйти из цикла
Всем привет Не понял, как можно выйти из цикла. Мне нужно, чтобы он выходил если if (IsValid).
Выйти с внешнего цикла
Всем привет,смотрите,есть вот такой вот код char fin; int pov; do
1291 / 908 / 479
Регистрация: 05.12.2013
Сообщений: 3,073

Сообщение было отмечено amr-now как решение
Решение
Сообщение от nikita55050505 
Собственно, как прервать цикл?
Нет такой опции в forEach, если только исключение выбрасывать
Регистрация: 17.02.2017
Сообщений: 117
С помощью чего-то такого выйти if (N==0) тогда. Но цикл продолжается до последнего элемента
@ nikita55050505
| Меню пользователя @ nikita55050505 |
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550

Сообщение было отмечено amr-now как решение
Решение
nikita55050505, Вам уже ответили, forEach нельзя остановить. Цикл for можно остановить, используйте его.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Не получается выйти из цикла
Я ввожу "1 2 3 4 -1 -5 1 -1". У меня есть 2 (A и B) последовательности "1 2 3 4" и "-5 1". Если B <.
do while — как выйти из цикла?
Подскажите пожалуйста, а то я уже всю голову "сломал", почему при вводе "А" цикл не прерывается.
Как выйти из цикла while();
#include <iostream> #include <fstream> #include <cctype> #include <string> #include <vector>.

Как выйти из цикла
Помогите пож дописать макрос! Нужно найти номер позиции первой буквы кириллицы в строке как.
Или воспользуйтесь поиском по форуму:
Прервать цикл forEach (javascript)
Есть массив со значениями. Внутри цикла есть условие поиска значения массива. Задача: остановить дальнейший перебор цикла при первом найденном значении. Спасибо за помощь. Решение: (спасибо Lieutenant Jim Dangle)
[1, 2, 3, 4, 3].some(function(el,i) < if (el == 3) < console.log(i); return el; >>);
Отслеживать
Менеджер Типографии
задан 6 янв 2017 в 12:28
Менеджер Типографии Менеджер Типографии
587 2 2 золотых знака 5 5 серебряных знаков 18 18 бронзовых знаков
@LieutenantJimDangle, твой код так же не работает как и код в вопросе 🙂
6 янв 2017 в 12:40
@LieutenantJimDangle, это просто убирает синтаксическую ошибку
6 янв 2017 в 12:43
Добавь в вопрос пример твоего массива, и что именно в нем ты хочешь найти и вывести.
6 янв 2017 в 12:59
Код решения неверен. результат возвращаемый функцией Callback переданной в some нужен только для проверки останавливать ли проход по коллекции или нет. Поэтому если вдруг искомый элемент будет 0 — то в твоем случае some пройдет по всей коллекции
6 янв 2017 в 13:09
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
метод forEach не предусматривает возможности прервать обход коллекции.
Если нужно проверить наличие конкретного элемента удовлетворяющего условию, лучше использовать метод some
var massiv = ['2', '1', '3']; console.log(massiv.some(function(item) < console.log('some', item); return (item == "1"); >));
Если проверяются полностью объекты, можно использовать метод indexOf
var massiv = ['2', '1', '3']; console.log(massiv.indexOf("1"));
Если нужно найти индекс элемента удовлетворяющего условию, то подойдет метод findIndex
var massiv = ['2', '1', '3']; console.log(massiv.findIndex(function(item) < console.log('findIndex', item); return item == "1"; >));
Если очень хочется использовать именно forEach — можно поместить его в try..catch и кидать ошибку если элемент найден.
var massiv = ['2', '1', '3']; try < massiv.forEach(function(item, i) < console.log('foreach', i); if (item == "1") < throw < reason: "finded", index: i >> >); > catch (< reason, index >) < if (reason) < console.log(reason, ':', index) >>
Вместо встроенных функций массива, можно также воспользоваться циклом for . В этом случае для прерывания цикла можно использовать выражение break
Отслеживать
ответ дан 6 янв 2017 в 12:48
81.1k 9 9 золотых знаков 78 78 серебряных знаков 135 135 бронзовых знаков
Во всех варианта у Вас именно поиск конкретного элемента. А задача была найти первый найденный. В Вашей интерпритации массива было бы так: var massiv = [‘2’, ‘1’, ‘3’, ‘1’]; И нужно найти индекс первой найденной еденички (то есть результатом остановки было бы значение 1 (второй элемент массива)
6 янв 2017 в 12:54
@МенеджерТипографии, все методы some , findIndex — прекращают выполнение, как только callback вернет true . Метод indexOf , находит первое вхождение элемента. начиная с указанного индекса, так как индекс не указан, проверка начинается с первого элемента массива.
6 янв 2017 в 12:56
@МенеджерТипографии, если задача заключается просто в проверке наличия элементов в массиве. то foreach вообще не нужен. В противном случае, все методы делают то же самое что и код в вопросе, за исключением прекращения выполнения когда условие выполнилось
6 янв 2017 в 12:58
В методе forEach не предусмотренa остановка как в лупе посредством брейк.
Использовать every заместо forEach . Когда будет false , все остановится.
Это самый правильный способ.
massiv.every(function(item, i) < if (item == "1") < console.log(i); return false; >else < return true; >>);
Отслеживать
81.1k 9 9 золотых знаков 78 78 серебряных знаков 135 135 бронзовых знаков
ответ дан 6 янв 2017 в 12:32
3,416 1 1 золотой знак 10 10 серебряных знаков 18 18 бронзовых знаков
на счет Это самый правильный способ — можно поспорить
6 янв 2017 в 13:04
я привел пример точно на поставленый вопрос, это делает то, что надо @Менеджер Типографии, все остальные ответы, по моему мнению не еффктивны. есть четко поставленый вопрос, и есть решение.
6 янв 2017 в 13:23
some — делает абсолютно то же самое. разница только в знаке сравнения. И все это менее эффективно чем обычный for за счет постоянного вызова функции-коллбэка. Кроме того, неизвестно что вообще нужно автору, что именно он хочет делать с полученным элементом. нужен ли ему элемент или индекс элемента и т.д.