Callbacks и asynchronousness две разные вещи, хотя они связаны, так как в JavaScript обратных вызовов является единственным механизмом, чтобы позволить вам управлять поток управления в асинхронном коде.
Погода или нет неасинхронные функции должны принимать обратные вызовы в зависимости от того, что делает функция. Один пример типа функции, который не является асинхронным, но полезен для обеспечения обратного вызова, - это функции итерации. Array.each()
- хороший пример. Javascript не позволяет вам передавать блоки кода, поэтому вы передаете функции своей итерационной функции.
Другим примером является функция фильтра, которая изменяет входящие данные и возвращает измененную версию. Array.sort()
- хороший пример. Передача функции к ней позволяет применять собственные условия для сортировки массива.
На самом деле, функции фильтрации имеют более вескую причину для приема функций/обратных вызовов, поскольку они изменяют поведение алгоритма. Функции итерации - это просто хороший синтаксический сахар вокруг петель и, следовательно, немного избыточный. Хотя, они делают код приятнее читать.
Погода или не функция должна быть асинхронной - это другое дело. Если для вычисления требуется много времени (например, операций ввода-вывода или больших матричных вычислений), то это должно быть сделано асинхронным. Как долго «длинный» зависит от вашей собственной толерантности. Как правило, для сайта с умеренной занятостью запрос не должен превышать 100 мс (другими словами, вы должны иметь возможность обрабатывать 10 ударов в секунду как минимум). Если операция занимает больше времени, то вы должны разделить ее и сделать ее асинхронной, иначе вы рискуете сделать сайт невосприимчивым к другим пользователям. Для действительно занятых веб-сайтов вы не должны терпеть операции, которые занимают больше 10 мс.
Из приведенного выше объяснения должно быть очевидно, что просто принятие функции или обратного вызова в качестве аргумента не делает функцию асинхронной. Простейшим способом pure-js сделать что-то async является использование setTimeout для разрыва длинных вычислений. Конечно, операция все еще происходит в том же потоке, что и основной процесс узла, но по крайней мере он не блокирует другие запросы. Чтобы использовать многоядерные процессоры на своих серверах, вы можете использовать одну из библиотек потоков для NPM или кластеров, чтобы сделать вашу функцию асинхронной.
1. Нет 2. В JavaScript/узле нет потоков. –
Хорошо, я знаю, что можно использовать внешнюю библиотеку для потока, и есть кластер, но я не знал, что нет поддержки для реальных потоков. Благодаря! –
@RandomUser Node использует многопоточность (а также мультипроцесс для кластеров). Это просто не делает любой из других доступными для кода JavaScript. Они предназначены только для [родных аддонов] (http://nodejs.org/api/addons.html) для поддержки разработки асинхронных API. –