effect_tw
@effect_tw

Зачем нужен then в промисах если есть await?

Зачем в промисах использовать then? если он не ждет результата выполнения запроса в промисе?, например 10 секундного. А закидывает в then промис в статусе Pending?
  • Вопрос задан
  • 426 просмотров
Пригласить эксперта
Ответы на вопрос 3
sergiks
@sergiks Куратор тега JavaScript
♬♬
«Вначале были промисы»
Затем, позже, сделали разноцветный синтаксический фантик для них — async / await

У промисов держателем кнопки «пауза» являтся очередной промис. У этого промиса, как будильника, можно вызвать метод then() — как приклеить стикер на циферблат, где написано, что надо будет сделать, когда время придёт.
В приклеенный метод then() ничего не попадает «сразу». Вернее, в него сразу передают 2 функции: одну вызовут, когда промис выполнится; вторую – если обломается: .then(onResolve, onError)
Стоит будильник, на нём наклейка then, на ней написано, что сделать, если ОК и если облом. Ждём-с. Тикает.

await прячет под капот движка JS лишние провода, и наверху просто возвращает результат выполненной асинхроты. Или кидает Exception в случае облома — его надо ловить обычными try..catch

Перечитав вопрос, предположу, что неправильно готовили промис с запросом. Надо примерно так:
const requestPromise = new Promise(function(res, rej) {
  setTimeout( function(result){ // имитация асинхр запроса куда-то
    // тут, типа, наконец получили ответ
    if (result.error_code) {
      rej(error_code); // облом
    } else {
      res(result); // обещание выполнено с результатом
    }
  }, 2000);
});

// здесь requestPromise – это Promise в статусе "pending"

requestPromise.then( // сюда ничего не попадает «сразу». Оно внутри ждёт. Терпеливо.
  function(result) {console.log(result, "мы молодцы");},
  function(error) {console.error(error, "облом вышел");},
);
При желании можно навесить ещё собак then'ов на тот же Promise:
requestPromise.then(r => console.log("result log:", r));
Ответ написан
Комментировать
@abberati
frontend-разработчик
Вы можете дожидаться момента выполнения промиса или через then, или через await. Await делает почти то же самое, что и then. Только await — синтаксическая фишка, а then — семантическая. Если нужно уточнить — спрашивайте.
Ответ написан
@Flying
Отвечая на вопрос в заголовке: Async functions (тот самый async/await) появился в спецификации ECMAScript только в версии ES2017, Promise же появился сильно раньше.

Отвечая на вопрос в тексте: then() вызывается в момент когда Executor (функция, переданная в Promise) вызывает переданный ей callback для resolve'а. Вообще это как-бы самая база использования Promise, так что возможно вам стоит освежить свои знания чтением документации.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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