Непонятно, что вы подразумеваете под «каналами», поскольку это не встроенная концепция node.js или термин, который используется внутри для описания того, как работает node.js. В руководстве, на которое вы ссылаетесь в своем комментарии, речь идет о языке Java, а не Язык Javascript, поэтому он не имеет абсолютно никакого отношения к node.js. Концепция «каналов» в этом руководстве — это то, что конкретная библиотека NIO реализует в Java.
Но если вы действительно просто спрашиваете, как работают асинхронные операции в node.js, я могу объяснить эту общую концепцию.
node.js работает с очередью событий. Интерпретатор node.js захватывает следующее событие в очереди событий и выполняет его (обычно это включает вызов функции обратного вызова). Эта функция обратного вызова работает (однопоточная) до тех пор, пока не вернется. Когда он возвращается, интерпретатор node.js ищет следующее событие в очереди событий. Если они есть, он захватывает это следующее событие и вызывает связанный с ним обратный вызов. Если в настоящее время в очереди событий нет событий, то он ожидает, пока событие будет помещено в очередь событий (если нечего ожидать, возможно, запустится какая-то сборка мусора).
Теперь, когда вы запускаете какую-то асинхронную операцию в своем Javascript (например, запрос к базе данных), вы можете использовать функцию запроса к базе данных, которая инициирует запрос (путем отправки запроса в базу данных), а затем немедленно возвращается. Это позволяет вашей части Javascript, которая запустила этот запрос, затем вернуться и вернуть управление node.js.
Между тем, какой-то собственный код управляет подключением к вашей базе данных. Когда ответ возвращается из базы данных, событие добавляется во внутреннюю очередь событий node.js.
Всякий раз, когда интерпретатор node.js заканчивает выполнение другого Javascript, он просматривает очередь событий, извлекает следующее событие и вызывает связанный с ним обратный вызов. Таким образом, результат вашего запроса к БД обрабатывается вашим кодом. Во всех случаях здесь с асинхронной операцией связан некий вид обратного вызова, который интерпретатор может вызвать, когда находит событие в очереди событий.
Будучи однопоточным, он хранит данные в каналах (если я не ошибаюсь).
В node.js нет концепции «каналов», поэтому я не уверен, что вы имели в виду.
Или он выполняет поставленную в очередь операцию в конце программы.
Когда результат возвращается из базы данных, некоторый собственный код, управляющий этим, вставит событие в очередь событий node.js. Интерпретатор Javascript обработает это событие, а затем в следующий раз вернется к циклу обработки событий (другой Javascript завершил работу, и пришло время проверить следующее событие для обработки).
Важно понимать, что запуск асинхронной операции не блокируется, поэтому вы получите следующее:
console.log("1");
callSomeAsyncFunction(someData, (err, data) => {
// this callback gets called later when the async operation finishes
// and node.js gets a chance to process the event that was put
// in the event queue by the code that managed the async operation
console.log("2");
});
// right here there is nothing else to do so the interpreter returns back
// to the system, allowing it to process other events
console.log("3");
Из-за неблокирующего характера вещей это будет регистрировать:
1
3
2
Некоторые другие ссылки по теме:
Как JavaScript обрабатывает ответы AJAX в фоновом режиме?
Где находится очередь событий node.js?
Обратные вызовы
Почему цикл while блокирует узел цикл событий?
person
jfriend00
schedule
08.05.2018