effect_tw
@effect_tw

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

Зачем в промисах использовать then? если он не ждет результата выполнения запроса в промисе?, например 10 секундного. А закидывает в then промис в статусе Pending?
  • Вопрос задан
  • 413 просмотров
Пригласить эксперта
Ответы на вопрос 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, так что возможно вам стоит освежить свои знания чтением документации.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы