Асинхронный и синхронный в функциях JavaScript. (Node.js)
В настоящее время я прохожу учебное руководство по nodechool.io по Javascript. Это пример кода одного из решений.
module.exports = function (dir, filterStr, callback) {
fs.readdir(dir, function (err, list) {
if (err)
return callback(err)
list = list.filter(function (file) {
return path.extname(file) === '.' + filterStr
})
callback(null, list)
})
}
Из того, что я понимаю, javascript - это синхронный язык. Тем не менее, node.js использует асинхронные функции. В этом коде не возможно, чтобы обратный вызов происходил до оператора if. Следовательно, есть ли какая-либо причина иметь функции, которые отличаются от формата
function(params, callback){
// one line data manipulation
callback();
}
3 ответа
Узел является однопоточным и основан на событиях. ввод / вывод - это то, что выполняется асинхронно. когда вы вызываете fs.readdir(), вы передаете ему объект функции в качестве аргумента. думать об этом как указатель на функцию в C++. fs.readdir() собирается запустить асинхронную операцию и передать этот функциональный объект обработчику событий, который сработает после завершения операции ввода-вывода.
Теперь он не ждет завершения операции ввода-вывода, он просто продолжает выполнять код до его завершения и затем возвращается к прослушиванию событий.
Когда он получает событие, инициируемое после завершения операции ввода-вывода, он запускает код в функциональном объекте, который был передан.
Из-за его однопоточной природы вам не нужно беспокоиться о таких типах расы.
Насколько я понимаю, javascript - это синхронный язык
Я думаю, что вы здесь что-то неправильно поняли. Javascript - это однопоточный язык. Но это не делает его синхронным. Почти каждая среда, в которой выполняется, включая самые последние из них, браузеры и Node.js, предоставляют глобальные очереди событий для асинхронной обработки.
Если я правильно понимаю ваш вопрос, я также предполагаю, что вы путаете уровни здесь. Общий модуль, который здесь представлен, обеспечивает свое собственное асинхронное поведение, принимая обратный вызов, который будет вызываться только асинхронно. Но это построено поверх другого асинхронного блока, вызова fs.readdir
, Обратным вызовом этого является анонимная функция, которая составляет большую часть вашего примера кода. Этот обратный вызов содержит if
-заявление. Другой, прошедший снаружи и названный callback
, произойдет в том же порядке, в котором она появляется внутри этой внутренней функции, то есть после if
-заявление.
Правильная асинхронная функция обычно вызывает обратный вызов после истечения времени ожидания или даже при возникновении события или получении сообщения, что означает, что он не будет занят потоком во время ожидания, оставляя обещание. В вашем примере сценарий продолжится после того, как вы назначите обратный вызов, и вызовет его, когда работа асинхронной функции будет выполнена, что, скорее всего, произойдет после того, как остальная часть вашего кода будет завершена.