Нет способа остановить forEach
. Вы можете имитировать остановку, установив флажок внутри forEach
, но он все равно будет проходить по всем элементам. Кстати, использование цикла для операции ввода-вывода не является оптимальным.
Как вы заявили, лучший способ обработать набор увеличивающихся данных для обработки - это сделать это один за другим, но я добавлю поворот: Threaded-one-by-one.
ПРИМЕЧАНИЕ: под нитью я не подразумеваю фактические темы. Возьми больше
определение «нескольких направлений работы». Поскольку операции ввода-вывода не блокируются
основной поток, пока один или несколько запросов ожидают данных,
другая «линия работы» может запустить JavaScript для обработки данных
получил, так как JavaScript является однопоточным
WebWorkers).
Это так же просто, как наличие массива страниц, который принимает страницы для сканирования на лету, и одна функция, которая читает одну страницу этого массива, обрабатывает результат и затем возвращается к начальной точке (загрузка следующей страницы массив и обработка результата).
Теперь вы просто вызываете эту функцию количеством потоков, которые вы хотите запустить, и сделали. Псевдо-код:
var pages = [];
function loadNextPage() {
if (pages.length == 0) {
console.log("Thread ended");
return;
}
var page = shift(); // get the first element
loadAndProcessPage(page, loadNextPage);
}
loadAndProcessPage(page, callback) {
requestOrWhatever(page, (error, data) => {
if (error) {
// retry or whatever
} else {
processData(data);
callback();
}
});
}
function processData(data) {
// Process the data and push new links to the pages array
pages.push(data.link1);
pages.push(data.link2);
pages.push(data.link3);
}
console.log("Start new thread");
loadNextPage();
console.log("And another one");
loadNextPage();
console.log("And another one");
loadNextPage();
console.log("And another thread");
loadNextPage();
Этот код остановится, когда в массиве не будет больше страниц, и если в какой-то момент окажется, что страниц меньше, чем количество потоков, потоки закроются. Здесь и там нужны некоторые настройки, но вы понимаете, в чем дело.