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

Как реализовано Promises в Javascript без потоков

Недавно я видел концепцию Promises, реализованную в AngularJS и JQuery.

Я видел реализацию фьючерсов в Java, как в коде ниже, однако для этого требуется понятие пулов потоков, присутствующих в языке/платформе. Однако в Javascript нет такой концепции потоковой передачи. Как реализовано Promises в Javascript?

public class Futures1 {

    private static final ExecutorService pool = Executors
            .newFixedThreadPool(10);

    public static void main(String[] args) {

        Future<String> contentsFuture = null;
        try {
            contentsFuture = startDownloading(new URL("http://www.example.com"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        // other computation
        try {
            final String contents = contentsFuture.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

    }

    public static Future<String> startDownloading(final URL url) {
        return pool.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                try (InputStream input = url.openStream()) {
                    return IOUtils.toString(input, StandardCharsets.UTF_8);
                }
            }
        });
    }
}
4b9b3361

Ответ 1

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

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

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

Примерами асинхронных вещей в Javascript являются практически все, в чем вы регистрируете интерес, и реальное событие происходит в будущем, и другой код может выполняться до того, как это событие сработает. В среде браузера Javascript это включает в себя такие вещи, как setTimeout(), события клавиатуры, события мыши, обратные вызовы завершения ajax и т.д. Это все асинхронные события. Вы регистрируете интерес к ним (регистрируя прослушиватель событий или передавая обратный вызов какой-либо функции). Внутри реализации Javascript, вероятно, есть потоки, которые делают эти асинхронные события работающими, но эти потоки не обязательно должны быть представлены программисту напрямую, чтобы асинхронная функциональность была там. Например, посмотрите этот пост, чтобы узнать, как Javascript управляет вызовами ajax в фоновом режиме, пока работают другие компоненты Javascript. Все, что вам нужно знать, это то, что ваша функция обратного вызова будет вызываться неопределенное время в будущем.

Итак, в Javascript обещания используются для управления асинхронными операциями, которые уже присутствуют в вашей среде. Они не используются для того, чтобы не асинхронные объекты стали асинхронными (для этого вам понадобятся потоки).

Имейте в виду, что сами обещания - это просто инструменты мониторинга, используемые для мониторинга существующих асинхронных операций. Обещания на самом деле не являются асинхронными, за исключением .then() который может быть реализован с помощью встроенного API, такого как setTimeout() или setImmediate() или nextTick(). Обещания не нуждаются в собственном собственном коде или потоках. На самом деле, вы можете написать реализацию обещания в простом однопоточном Javascript, если хотите.

Ответ 2

Собственный код, написанный браузером под слоем JavaScript, имеет тенденцию к тому, чтобы потоки были реализованы очень аккуратно. Как оказалось, это обычно все, что вам нужно. Promises как правило, не нужны для выполнения фактической работы по вычислению в JavaScript (хотя работники делают это проще), но для загрузки внешних ресурсов и получения обратных вызовов, когда они будут выполнены. JS Promises просто назначает обратные вызовы таким функциям, как "image.onLoad", и проверяет, следует ли уведомлять другую функцию.

Хоган, возможно, лучше всего обобщил это событие - программирование на основе событий.

Ответ 3

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

Вот несколько ответов:

Отвечать1

Отвечать2