Асинхронный JavaScript с функциями высшего порядка

Является ли JavaScript функциональным языком программирования или нет, я оставляю вам решать, но у языка есть аспекты из парадигмы функционального языка. См. ссылку Вики.

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

Функции обратного вызова имеют большое значение в JavaScript. Это техника, которая позволяет JavaScript работать асинхронно. Это означает, что ваша программа может продолжать выполняться без необходимости останавливаться и ждать выполнения задачи. Обратные вызовы являются прямым результатом функций высшего порядка, функции, которая принимает другую функцию в качестве аргумента. Вы, вероятно, использовали функции обратного вызова, когда вы передаете функцию в качестве аргумента в Array.prototype.map() или когда вы обрабатываете сценарии из разных ответов на ваши вызовы AJAX.

Это setInterval принимает функцию обратного вызова в качестве аргумента:

setInterval(() => { 
  alert(“Stop calling me”)
}, 3000)

Через три секунды анонимная функция сработает из очереди обратного вызова и предупредит сообщение. В течение этих трех секунд наша среда выполнения может продолжать выполнять другие обратные вызовы или события. Здорово!

Обратный вызов — это функция, которая выполняется позже

Давайте создадим нашу собственную функцию обратного вызова:

let data = []
function mergeData(param) {
  setTimeout(() => {
    data = data.concat(param)
    alert('Duplication done')
  }, 3000)
}
function setData(…args) {
  let [param, callback] = args
  data = param
  if(typeof callback === 'function') {
    console.log('Starting merge')
    callback(arr)
    console.log('Continue program while awaiting..')
  }
}

Мы создаем функцию с именем mergeData, она принимает параметр, запускает тайм-аут и через 3 секунды объединяет данные и с заданным параметром. Пока ничего особенного, но достаточно хорошо, чтобы показать концепцию.

Теперь мы хотим передать mergeData в качестве функции обратного вызова. Мы создаем функцию setData, деконструируя ее аргументы, устанавливаем значение данных равным первому аргументу функции, проверяем, чтобы аргумент обратного вызова был функцией. функция обратного вызова. Обратный вызов можно назвать как угодно, но для простоты я назвал его обратный вызов.

Наконец, мы вызываем setData с массивом и duplicateData в качестве функции обратного вызова:

setData([1, 2, 3], duplicateData)
-> 'Starting merge'
-> 'Continue program while awaiting..'
-> 'Duplication done'
data // [1, 2, 3, 1, 2, 3]

Обратные вызовы — это мощный и интересный компонент JavaScript. Когда я был новичком в JavaScript, я некоторое время использовал обратные вызовы, не зная, что это такое и как оно работает. Я полагаю, что многие люди, плохо знакомые с программированием или, в частности, с JavaScript, могут быть сбиты с толку этой концепцией.

Если вы нашли это полезным или у вас есть что добавить, пожалуйста, прокомментируйте ниже.

Наслаждайтесь своим кодом.