Мне любопытно, являются ли все обратные вызовы javascript асинхронными, или это происходит только в определенных ситуациях. Кроме того, я уверен, что код javascript асинхронный (или способы использования асинхронного javascript) отличается между браузером и nodejs, поэтому я хотел бы знать в каждой ситуации, что представляет собой настоящий асинхронный javascript.
У меня создается впечатление, что в следующем сценарии я на самом деле не писал асинхронный код.
function addOne(value){
value = value + 1;
return value;
}
function simpleMap(values, callback){
for(i = 0; i < values.length; i++){
val = values[i];
val = callback(val);
values[i] = val;
}
return values;
}
newValues = simpleMap([1,2,3], addOne);
Однако, например, я знаю, что функции jQuery AJAX действительно асинхронны (не принимая во внимание promises, которые теперь доступны). Что делает jQuery AJAX асинхронным? Это так просто, что он включает запросы XHR, и в браузере все запросы XHR являются асинхронными?
У меня такой же вопрос для среды nodejs. Может ли что-то в node быть асинхронным, если оно включает в себя что-то вроде файла i/o, process.nextTick, setTimeout или setInterval? Почему, когда я делаю что-то вроде вызова базы данных с mongodb/mongoose, это асинхронно? Что происходит за кулисами, которые делают это так?
Являются ли асинхронные "ситуации" предопределенными средой? Или есть способ сделать одну собственную функцию по-настоящему асинхронной, не используя очень специфические функции среды (такие как xhr, файл io в node, process.nexttick и т.д.)?