Подтвердить что ты не робот

Является ли Javascript синхронным (блокирующим) или асинхронным (неблокирующим) по умолчанию

Я пытаюсь понять асинхронные функции и обратные вызовы Javascript.

Я застрял в концепции функций обратного вызова, где я читаю в некоторых местах: они используют для последовательного выполнения кода (в основном в контексте jquery eimate animate) и некоторых мест специально в контексте Nodejs; они используют для параллельного выполнения асинхронного и избегают блокировки кода.

Так может ли кто-нибудь из экспертов в этой теме пролить свет на это и очистить этот пух в моем сознании (примеры?).  поэтому я мог бы подумать об использовании функции обратного вызова

или это зависит только от места, где вы звоните/размещаете функцию обратного вызова в своем коде?.

Спасибо,

P.S: Я боюсь, что этот вопрос будет близок как субъективный, но все же я мог бы ожидать конкретного ответа для этого (возможно, некоторых примеров)

Изменить: На самом деле это пример из Интернета, который делает меня двусмысленным:

function do_a(){
  // simulate a time consuming function
  setTimeout( function(){
    console.log( '`do_a`: this takes longer than `do_b`' );
  }, 1000 );
}

function do_b(){
  console.log( '`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`' );
}

do_a();
do_b();

Результат

`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`
`do_a`: this takes longer than `do_b`

когда JS является последовательным, тогда do_b всегда следует после do_a в соответствии с моим пониманием.

4b9b3361

Ответ 1

Ядро JavaScript в значительной степени синхронно, поскольку эти функции полностью выполняют свою задачу до завершения. До появления AJAX это было действительно только setTimeout и setInterval, которые обеспечивали асинхронное поведение.

Тем не менее, легко забыть, что обработчики событий - это эффективный асинхронный код. Прикрепление обработчика не вызывает код обработчика, и этот код не выполняется до некоторого непознаваемого времени в будущем.

Затем появился AJAX с его вызовами на сервер. Эти вызовы могут быть настроены как синхронные, но разработчики обычно предпочитают асинхронные вызовы и используют методы обратного вызова для их реализации.

Затем мы увидели распространение JS-библиотек и наборов инструментов. Они стремились к гомогенизации различных реализаций браузеров и построили подход обратного вызова к асинхронному коду. Вы также начали видеть гораздо более синхронные обратные вызовы для таких вещей, как итерация массива или обработка результатов запроса CSS.

Теперь мы видим Отсрочки и Promises в миксе. Это объекты, которые представляют ценность длительной операции и предоставляют API для обработки этого значения, когда он поступит.

NodeJS склоняется к асинхронному подходу ко многим вещам; это правда. Однако это скорее конструктивное решение с их стороны, чем какой-либо присущий асинхронному характеру JS.

Ответ 2

Javascript - это синхронный (блокирующий) один поток, но мы можем сделать Javascript асинхронным с помощью программирования.

Синхронный код:

console.log('a');
console.log('b');

Асинхронный код:

console.log('a');
setTimeout(function() {
    console.log('b');
}, 1000);
setTimeout(function() {
    console.log('c');
}, 1000);
setTimeout(function() {
    console.log('d');
}, 1000);
console.log('e');

Эти выходы: a e b c d

Ответ 3

В node длинные процессы используют process.nextTick() для очереди функций/обратных вызовов. Обычно это делается в API node, и если ваше программирование (вне api) с чем-то, что блокирует или код, который работает долго, то это на самом деле не сильно влияет на вас. Ссылка ниже должна объяснить это лучше, чем я могу.

howtonode process.nextTick()

jQuery AJAX также принимает обратные вызовы и, например, его кодирует, чтобы не дожидаться ответов сервера, прежде чем переходить к следующему блоку кода. Он просто запоминает функцию для запуска, когда сервер отвечает. Это основано на объекте XMLHTTPRequest, который просматривают браузеры. Объект XHR будет помнить функцию для вызова, когда ответ вернется.

setTimeout(fn, 0) javascript будет запускать функцию после того, как стек вызовов пуст (следующий доступный свободный тик), который можно использовать для создания асинхронных функций. fooobar.com/questions/12932/...

Чтобы летать, асинхронные способности javascript также связаны с средами, которые они запрограммированы как javascript. Вы не получаете никакой магии, просто используя множество вызовов функций и обратных вызовов, если вы не используете какой-либо API/ script.

Jquery Deferred Object Это еще одна хорошая ссылка для асинхронных возможностей jQuery. Google может найти информацию о том, как работает jQuery Deferred для более глубокого понимания.

Ответ 4

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

Например: в этом примере блок кода выполняется построчно, так как вывод зависит от предыдущих вычислений.

 $("#text1").on('change ',function(){
    var val1= $(this).val();
    var val2 =2;
    var output= val1*val2;
    alert(output);
 });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="text1">