Понимание объекта обещания JavaScript

Я пытаюсь обернуть голову вокруг объекта обещания в JavaScript. Итак, у меня есть этот маленький кусочек кода. У меня есть объект promise и два console.log() по обе стороны от объекта обещания. Я думал, что это напечатает

привет

Там

З

но напечатано

HI

zami

there

Почему это так? Я не понимаю, как работает обещание, но я понимаю, как асинхронный обратный вызов работает в JavaScript. Кто-нибудь может пролить свет на эту тему?

console.log('hi');
var myPromise = new Promise(function (resolve, reject) {
    if (true) {
        resolve('There!');
    } else {
        reject('Aww, didn\'t work.');
    }
});

myPromise.then(function (result) {
    // Resolve callback.
    console.log(result); 
}, function (result) {
    // Reject callback.
    console.error(result);
});
console.log('zami');

Ответ 1

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

В основном, ваш код делает следующее:

  • Журнал "Привет"
  • Создать обещание
  • Выполнение обещания
  • Журнал 'zami'
  • Обещание разрешено и регистрируется "Там".

Если вы хотите, чтобы он печатал "Привет, zami", вам нужно

myPromise.then(function (result) {
    // Resolve callback.
    console.log(result); 
    console.log('zami');
}, function (result) {
    // Reject callback.
    console.error(result);
});

Ответ 2

Резюме:

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

Обещание может иметь 3 состояния:

  1. Ожидание. Это начальное состояние обещания. Теперь обещание ожидает разрешения или отклонения. Например, когда вы обращаетесь к Интернету с помощью запроса AJAX и заключаете запрос в обещание. Тогда обещание будет отложено во временном окне, в котором запрос не будет возвращен.
  2. Выполнено: Когда операция успешно завершена, обещание выполнено. Например, когда мы стремимся быть в сети, используя AJAX для некоторых данных JSON и заключая их в обещание. Когда мы успешно получаем данные, обещание считается выполненным.
  3. Отклонено: При сбое операции обещание отклоняется. Например, когда мы стремимся быть в сети, используя AJAX для некоторых данных JSON и заключая их в обещание. Когда мы получаем ошибку 404, обещание было отклонено.

Конструктор Promise:

Мы можем создать обещание следующим образом:

let prom = new Promise((res, rej) => {
  console.log('synchronously executed');
  if (Math.random() > 0.5) {
    res('Success');
  } else {
    rej('Error');
  }
})


prom.then((val) => {
  console.log('asynchronously executed: ' + val);
}).catch((err) => {
  console.log('asynchronously executed: ' + err);
}).finally(() => {
  console.log('promise done executing');
});


console.log('last log');

Ответ 3

Даже если вы разрешили обещанное синхронно, обработчики, которые вы передаете в then, вызываются асинхронно. Это соответствует определенной спецификации:

onFulfilled и onRejected выполняются асинхронно после поворота цикла событий, в котором затем вызывается, и с новым стеком

Ответ 4

Если вы хотите узнать, как это работает, вы можете прочитать здесь здесь. Он показывает пример того, как реализовать обещание, чтобы вы могли лучше понять объект.