2012-03-18 2 views
3

Promises в JS позволяет сделать программирование асинхронного следующим образом:Как асинхронное программирование (обещания) реализовано в javascript? не является javascript ui-threaded environment?

DoSomething().then(success, failure); 

DoSomethingElse(); 

всякий раз, когда я пишу предыдущий код он достигает DoSomethingElse() прежде чем он достигнет success. Как это возможно? Разве JS не является ничейной средой (не включая веб-работников)? это делается с setTimeout?

+2

Проблема рассмотрена довольно хорошо здесь: http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded –

+0

'async' не подразумевает' concurrent', где вы идут не так. –

ответ

5

Да, JavaScript однопоточный, что означает, что вы никогда не должны блокировать эту нить. Любая долгожданная операция ожидания (как правило, AJAX вызовы или спящие/паузы) реализуются с использованием обратных вызовов.

Не смотря на реализацию, вот что происходит:

  1. DoSomething вызывается и получает success и failure функции в качестве аргументов.

  2. Он делает то, что ему нужно сделать (вероятно, инициируя долгоиграющих AJAX вызова) и возвращает

  3. DoSomethingElse() называется

  4. ...

  5. Некоторое время спустя AJAX ответ приходит , Он вызывает определенные ранее success и failure функции

Смотрите также (аналогичные проблемы)

+0

при выполнении вызова ajax объект xhr является тем, который открывает новый поток, поэтому это не проблема. Что если это не вызов ajax? что, если длинная задача сортирует массив, например? как это реализовано? –

+3

@ EladKatz: при выполнении долговременных задач с интенсивным использованием ЦП (например, сортировка массива или огромных манипуляций с DOM) поток пользовательского интерфейса занят, а графический интерфейс заблокирован (зависает). Никакие тайм-ауты не выполняются, никакой ответ AJAX не обрабатывается, обработчики событий кликов не вызываются. Сожалею. –

0

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

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

MyApi.LongRunningTask(), а затем (функция (результат) {MyAppi.LongOtherTask (результат);}), то

или последовательный прецедент, когда длительные вызовы не зависят:

var value1 = MyApi.LongRunningTask();
var value2 = MyApi.LongRunningOtherTask();

MyApi.DoSomeFunction (value1, value2) .then ==> DoSomeFunction может проверить, готовы ли значения, а если нет, то их функция then/when будет выполнять свою логику.