Ответ 1
Обещания были изобретены, чтобы помочь управлять асинхронными операциями. Самим обещаниям не нужны темы для этого. Они являются объектами, которые по существу обеспечивают учет для асинхронных операций - сохраняя флаги состояния, значения результатов и прослушиватели для перехода состояния. Это все, что можно легко сделать с помощью обычного однопоточного Javascript.
Таким образом, пока у вас есть асинхронные операции (однако эти операции реализованы), вы можете извлечь выгоду из обещаний и вам не нужны потоки для их реализации.
То, что вы видите в своем Java-коде, - это код, который помогает запускать обычные задачи в отдельном потоке (для придания синхронным операциям некоторого поведения асинхронного типа). Это не то, что делают обещания. Итак, если у вас уже есть асинхронные операции в вашей среде, вам не понадобится этот тип кода для использования обещаний.
Примерами асинхронных вещей в Javascript являются практически все, в чем вы регистрируете интерес, и реальное событие происходит в будущем, и другой код может выполняться до того, как это событие сработает. В среде браузера Javascript это включает в себя такие вещи, как setTimeout()
, события клавиатуры, события мыши, обратные вызовы завершения ajax и т.д. Это все асинхронные события. Вы регистрируете интерес к ним (регистрируя прослушиватель событий или передавая обратный вызов какой-либо функции). Внутри реализации Javascript, вероятно, есть потоки, которые делают эти асинхронные события работающими, но эти потоки не обязательно должны быть представлены программисту напрямую, чтобы асинхронная функциональность была там. Например, посмотрите этот пост, чтобы узнать, как Javascript управляет вызовами ajax в фоновом режиме, пока работают другие компоненты Javascript. Все, что вам нужно знать, это то, что ваша функция обратного вызова будет вызываться неопределенное время в будущем.
Итак, в Javascript обещания используются для управления асинхронными операциями, которые уже присутствуют в вашей среде. Они не используются для того, чтобы не асинхронные объекты стали асинхронными (для этого вам понадобятся потоки).
Имейте в виду, что сами обещания - это просто инструменты мониторинга, используемые для мониторинга существующих асинхронных операций. Обещания на самом деле не являются асинхронными, за исключением .then()
который может быть реализован с помощью встроенного API, такого как setTimeout()
или setImmediate()
или nextTick()
. Обещания не нуждаются в собственном собственном коде или потоках. На самом деле, вы можете написать реализацию обещания в простом однопоточном Javascript, если хотите.