Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Работа промисов в JS

Screamer Ученик (122), на голосовании 1 год назад
У меня есть функция, которая возвращает промис:

 findUserName(username, password).then( conosole.log ); 
В данном случае все работает прекрасно, в консоль выводится то что мне надо.
Однако если код будет таким
 let username;
findUserName(username, password).then( result => username = result );
console.log(username);
то в консоль выведется: Promise { <pending> }.
Почему? Ведь .then() Выполняется уже после того, как промис выполнится
Голосование за лучший ответ
Professional Professional Мудрец (15955) 1 год назад
Проблема, которую вы описываете, связана с асинхронной природой промисов в JavaScript. При использовании промисов и функции `.then()`, код внутри `.then()` выполняется асинхронно после завершения промиса.

В вашем втором примере, когда вы вызываете `console.log(username)` сразу после вызова `findUserName()`, код внутри `.then()` еще не выполнился, поэтому значение переменной `username` все еще равно `undefined`. Когда `console.log()` выполняется, промис еще не завершился, и поэтому вы видите вывод `Promise { <pending> }`.

Для получения ожидаемого результата, вам нужно выполнить `console.log(username)` внутри блока `.then()`, чтобы убедиться, что вывод происходит после завершения промиса и присваивания значения переменной `username`. Например:

```javascript
let username;
findUserName(username, password).then(result => {
username = result;
console.log(username);
});
```

Таким образом, `console.log(username)` будет вызван после того, как значение переменной `username` будет установлено в результат промиса.
Дмитрий Знаток (429) 1 год назад
Добрый день, код отрабатывает в том порядке, в котором написан, и в момент вывода username в консоль действительно все еще происходит pending. Добавьте перед промисом оператор await
Dlazder Мудрец (16914) 1 год назад
Ну да, then выполняется поочередно. Только весь остальной код продолжает работать, это асинхронность. Если хочешь чтобы consol.log сработал после вставляй его в then
Павел Просветленный (25620) 1 год назад
Выводится Promise { <pending> } скорее всего потому что ты код вставил на прямую в консоль. Консоль всегда выводит результат выражения. В данном случае метод "then()" вернул тебе "Promise { <pending> }".
Что на счёт переменной "username" то ты её выводишь синхронно. Синхронный код выполняется ДО промиса. На момент вывода username = undefined.
Похожие вопросы