Как асинхронное программирование (обещания) реализовано в JavaScript?не является ли javascript средой с пользовательским интерфейсом? - PullRequest
4 голосов
/ 18 марта 2012

Обещания в JS позволяют выполнять асинхронное программирование следующим образом:

DoSomething().then(success, failure);

DoSomethingElse();

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

Ответы [ 2 ]

5 голосов
/ 18 марта 2012

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

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

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

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

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

  4. ...

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

См. Также (похожие проблемы)

0 голосов
/ 18 марта 2012

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

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

MyApi.LongRunningTask (). then (function (result) {MyAppi.LongOtherTask (result);}). then

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...