Наиболее часто используемые встроенные функции 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