Наиболее часто используемые встроенные функции JavaScript для итераций - это reduce, map и forEach. Синхронные итерации с этими функциями очень распространены в разработке JavaScript, и в этой статье мы рассмотрим синхронные и асинхронные версии функции reduce итератора.

Синхронное уменьшение

Здесь мы получаем массив чисел с именем nums в качестве параметра функции sumIt. В функции sumIt итератор reduce запускается для массива nums, и из функции sumIt возвращается сумма всех чисел. Функция уменьшения ожидает два аргумента. Первый аргумент - это функция обратного вызова, имеющая два параметра, а второй аргумент - это начальное значение, передаваемое итератору сокращения перед запуском любой итерации. Функция обратного вызова вызывается с тремя аргументами, где первый аргумент - это результирующее значение из предыдущей итерации (начальное значение в случае первой итерации), второй аргумент - это текущее значение индекса уменьшающего массива, а третий - текущий индекс уменьшающего массива. Мы не используем третий аргумент индекса в нашем примере и указали только два параметра для получения первых двух аргументов в обратном вызове. Функция итератора сокращения возвращает только одно значение. Это может быть любое значение, например целое число, логическое значение, объект, массив и обещание в случае асинхронного обратного вызова.

Функция уменьшения запускает обратный вызов для каждого элемента массива и накапливает значение каждой итерации в локальной переменной accumulator, и в конце всех итераций это значение accumulator возвращается как результат операции сокращения.

В нашем примере выше результат будет:

Sum: 10

Асинхронное сокращение

Асинхронная версия итератора reduce ожидает асинхронную функцию обратного вызова в качестве первого аргумента и начальное значение для первой итерации итератора reduce в качестве второго аргумента. Начальное значение может быть любого типа, включая разрешенное обещание. В случае примитивного типа начальное значение обертывается с помощью Promise, но в случае с Promise оно не обертывается и используется как есть. Первый аргумент обратного вызова - это значение, возвращенное из предыдущей итерации, как и версия для синхронизации, но в отличие от версии для синхронизации это значение всегда является обещанием, которое необходимо разрешить перед использованием. Второй аргумент обратного вызова - это значение текущей итерации, как и в синхронизированной версии reduce.

Функция reduce выполняет обратный вызов для всех элементов массива параллельно или, другими словами, одновременно. Все итерации итератора сокращения запускаются параллельно, и любая итерация останавливается только тогда, когда он ожидает разрешения своего accumulator, и это происходит, когда его предыдущая итерация вернула свой результат. Здесь мы можем использовать эффективный параллелизм и выполнять любые операции, не зависящие от результата предыдущей итерации, прежде чем ждать разрешения accumulator. Правильное место для решения accumulator должно быть тщательно определено, чтобы не замедлить процесс в случае, когда некоторые ресурсоемкие задачи выполняются параллельно.

В нашем примере выше результат будет таким же:

Sum: 10