Некоторые вопросы о обещании в JavaScript

Меня смущает поведение Promise в JavaScript, и у меня есть вопросы. Может ли кто-нибудь помочь мне разобраться в них?

  1. Это два распространенных способа создания обещания.

    function promise(){
        return new Promise((resolve, reject) => {
            resolve()});
    }
    
    let promise = new Promise(function(resolve, reject){
        resolve();
    });
    

    Первая функция создает объект Promise, но не вызывает его, пока мы не вызовем функцию. Для сравнения, второй оператор создает объект Promise и немедленно вызывает его. Я прав?

  2. Для этой функции:

    function timeout(ms){
        return new Promise((resolve, reject) => {
            setTimeout(resolve, ms, 'done');
    });
    }
    
    timeout(100).then((value) => {
        console.info(value);
    });
    

    Я думаю, что когда мы вызываем функцию тайм-аута, она сначала создает асинхронную функцию setTimeout и помещает ее в конец очереди событий. После завершения всех синхронных событий он будет вызван и создаст объект Promise. Объект Promise также будет помещен в конец очереди событий, после других синхронных событий. Итак, кажется, есть два цикла событий, я прав?

  3. Равны ли эти два утверждения?

    let promise = new Promise(function(resolve, reject){
        resolve();
    });
    
    let promise = Promise.resolve();
    
  4. Почему выходная последовательность выглядит следующим образом?

    setTimeout(function(){
        console.info('3');
    }, 0);
    
    Promise.resolve().then(function(){
        console.info('2');
    });
    
    console.info('1');
    
    // 1
    // 2
    // 3
    

    Это пример из книги, автор объясняет следующее: setTimeout(fn, 0) будет вызываться в начале следующего цикла событий, Promise.resolve() будет вызываться в конце текущего цикла событий, а console.info() будет вызван немедленно.

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

Что касается 1), экземпляр Promise создается при вызове new Promise(). Первый способ создает функцию, которая будет делать это при вызове, второй способ просто напрямую создает Promise. Этот факт не имеет ничего общего с тем, как работают обещания, то же верно и для new Date().

Chris G 25.12.2018 00:02

да, нет, да, очереди событий больше одной (одна для «задач» и одна для «микротаз», одна nodejs их и того больше)

Jonas Wilms 25.12.2018 00:02
setTimeout(fn, 0); на самом деле является setTimeout(fn, 10); setTimeout не поддерживает таймауты менее 10 мс + это не "вызвать fn через 10 мс", а скорее "позвоните fn, как только у вас будет время не менее чем через 10 мс"
Thomas 25.12.2018 00:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
300
2

Ответы 2

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

  1. Нет, функция не будет создавать обещание, пока вы ее не вызовете.
  2. Обещание будет создано, когда вы вызовете timeout (100), будет разрешено в setTimeout. Не уверен в деталях очереди событий.
  3. Вроде так (пробовал в приставке).
  4. Обязательно посмотрите этот Филип Робертс: Что, черт возьми, за цикл событий? | АОонф ЕС минут 11:30 или около того.

Филип Робертс не говорит в своем видео о микрозадачах, которые являются причиной «странного поведения» в 4-м примере.

lleon 25.12.2018 00:25

Другие вопросы по теме