2016-06-19 4 views
4

Я слышал, как люди говорили об асинхронных операциях в javascript. С другой стороны, люди говорят, что Javascript всегда синхронно sync javascript. Что является правдой? Является ли Javascript действительно асинхронным или синхронным? Что люди имеют в виду, когда говорят об асинхронном javascript?Асинхронные операции в javascript

Я понял, что Javascript на той же странице нельзя запускать одновременно с другим блоком кода javascript. Но, например, в запросах ajax, ожидая ответа сервера, можно выполнить код, а затем, когда ответ пришел, продолжите обратный вызов. Хотя это означает, что код, который был запущен, пока мы ждали ответа сервера, должен будет закончить сам, иначе он будет прерван?

+0

Как это дубликат другого вопроса? Потому что название похоже на этот вопрос? – Jacob

ответ

4

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

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

6

Возможно, вы смешиваете синхронность с параллелизмом. JavaScript не имеет параллелизма или одновременно запускает два потока выполнения; вы должны создать совершенно новый интерпретатор JavaScript с такими вещами, как Web Workers, или запустить кластер рабочих в случае Node для получения параллелизма.

Однако у него есть асинхронность; вы регистрируете обратные вызовы для событий, которые происходят асинхронно, и цикл событий вызывает эти обратные вызовы в последовательности, в которой они происходят. Обработчики событий по-прежнему несовместимы, но это не делает JavaScript неасинхронным.

+1

Вау, наши ответы почти одинаковы. Я удивлен, что мой настолько близок к твоему, клянусь, что я ничего не копировал: P –

+0

Означает ли это, что обратные вызовы должны не только ждать ответа сервера, но и им нужно ждать другого инициированного jscript для того чтобы работать в то же время до конца, до того, как будет вызван фактический обратный вызов? –

+0

Ха-ха, слово @PatrickRoberts – Jacob

1

Они говорят об асинхронных запросах, как правило, на сервере или прослушивателях событий. setInterval и SetTimeout также не пересекаются и ждать текущей функции, чтобы закончить


Пример из обратного вызова (что-то, чтобы быть вызван после завершения)

myElement.addEventListener("mousedown", function (event) { 
    console.log("this is a callback function and the listener event is:", event); 
}); 

Более продвинутые, надежные и лучший способ написать async - использовать обещает, где вы можете легко увидеть шаблон и передать свои данные так, как будто он уже существует.Обещания действительно отдельные обертки «обещанные данные»

где определен Promise является:

var getPromisedMouseDownEvent = new Promise(function (resolve, reject) { 
    myElement.addEventListener("mousedown", function (event) { 
     resolve(event); 
    } 
}; 

Когда цепь обещания, вы можете разделить их в чистой моде, в то время как обратные вызовы немного грязнее

var getPromisedData = new Promise(function (resolve) { 
    resolve(); 
}); 
var getPromisedData2 = getPromisedData.then(function() { 
    return new Promise(function (resolve) { 
     resolve(); 
    }); 
}); 
var getPromisedData3 = getPromisedData2.then(function() { 
    return new Promise(function (resolve) { 
     resolve(); 
    }); 
}); 

Вы также можете обсчитывать:

request1.then(request2).then(request3).then(function (data) { 
    console.log(data); 
}); 
+1

Я бы не сказал, что вы можете «рассматривать обещания как последовательные». Единственная языковая конструкция, которая, как я бы сказал, обеспечивает синхронное восприятие асинхронного кода, - это предлагаемые ключевые слова ESON 'async' и' await'. Проверьте [this] (https://jakearchibald.com/2014/es7-async-functions/). –

7

Javascript может выполнять код асинхронно (т. Е. «В фоновом режиме»), но не одновременно (т. Е. «Одновременно»). Разница в том, что асинхронный JavaScript-код будет работать только тогда, когда другого кода не будет.

Рассмотрим следующий пример:

// print message asynchronously 
setTimeout(function() { 
    console.log('message'); 
}, 1000); 

// infinite loop 
while(true) { } // WARNING: if you actually try to run this, it will 
       //   likely crash your browser... 

Если JavaScript был истинный параллелизм, можно было бы ожидать, что message будет печататься после 1000 мс. Однако, поскольку JavaScript просто асинхронен, он должен ждать, пока другой код не будет запущен; поскольку он застрял в бесконечном цикле, поэтому он никогда не сможет запустить код внутри функции setTimeout.

+1

Хороший конкретный пример параллельного и асинхронного. –

Смежные вопросы