@kirillleogky

Как работает асинхронный код?

// Создаётся объект promise
let promise = new Promise((resolve, reject) => {

    setTimeout(() => {
        // переведёт промис в состояние fulfilled с результатом "result"
        resolve("result");
    }, 1000);

});

// promise.then навешивает обработчики на успешный результат или ошибку
promise
    .then(
        result => {
            // первая функция-обработчик - запустится при вызове resolve
            alert("Fulfilled: " + result); // result - аргумент resolve
        },
        error => {
            // вторая функция - запустится при вызове reject
            alert("Rejected: " + error); // error - аргумент reject
        }
    );


Я хотел бы уточнить как работает асинхронность в данном примере.

Я правильно понял что данный код
setTimeout(() => {
        // переведёт промис в состояние fulfilled с результатом "result"
        resolve("result");
    }, 1000);

через 1 секунду сохранит в resolve значение "result"?

Но до того как пройдёт 1 секунда resolve отправляется сюда и ждёт сохранение "result"? А после того как 1 секунда пройдёт вызывает alert со значением resolve?
.then(
        result => {
            // первая функция-обработчик - запустится при вызове resolve
            alert("Fulfilled: " + result); // result - аргумент resolve
        },
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
filgaponenko
@filgaponenko
frontend developer
Изначаль созданный вами промис находится в состоянии pending

Данный код
setTimeout(() => {
        // переведёт промис в состояние fulfilled с результатом "result"
        resolve("result");
    }, 1000);


Хранится в объекте промиса и будет вызван сразу, а когда будет вызван `resolve`, этот вызов стриггерит на объекте промиса событие изменения состояния.
Т.к. вызывается resolve то промис переходит в состояние fulfilled и значение из resolve передается в коллбек, который будет вызван внутри then.

Не уверен, что правильно понял суть вашего вопроса, но надеюсь это сможет помочь.

  1. https://learn.javascript.ru/promise
  2. https://habr.com/ru/company/mailru/blog/269465/
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
hzzzzl
@hzzzzl
javascript подчиняется модели Event Loop, скрипт выполняется "в одном потоке", в каждом цикле (tick) этого цикла проверяются все отложенные таймеры, все обработчики событий итд

5d3ea7f4c055b225593400.png

// Создаётся объект promise
// не происходит ничего, просто сохраняется объект
let promise = new Promise((resolve, reject) => {
// МЕТКА №1 (см.ниже)
// выполняется setTimeout()
// цифра 1 на картинке, код сейчас здесь
    setTimeout(() => {
        // цифра 2 на картинке, через секунду (или когда у процессора будет время)
        // интерпретатор JS будет разбирать timer queue и выполнит коллбек resolve()
        // тем самым "разрешит" промис
        resolve("result");
    }, 1000);

});

// promise.then навешивает обработчики на успешный результат или ошибку
promise
// GOTO метка №1
    .then(
        result => {
            // первая функция-обработчик - запустится при вызове resolve
            // в Timer Queue (возможно) будет ссылка на эту функцию, и она вызовется с аргументом result
            alert("Fulfilled: " + result); // result - аргумент resolve
        },
        error => {
            // вторая функция - запустится при вызове reject
            // в Timer Queue (возможно) будет ссылка на эту функцию, и она вызовется с аргументом result
            alert("Rejected: " + error); // error - аргумент reject
        }
    );
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы