Ответ 1
Это сложно, и я не обвиняю вас в том, что вы в замешательстве. Все, кто новичок в Node, похоже, запутались в этом.
Ваша проблема заключается в том, что переменная будет изменена правильно - только пока не выполняется console.log()
.
Когда функция возвращает обещание, это означает, что что-то произойдет в будущем - возможно, в одно мгновение, возможно, позже, но еще не в то время, когда эта функция возвращает обещание.
Затем вы можете добавить обработчиков выполнения и отклонения к обещанию - эти обработчики будут вызваны, когда обещание будет фактически разрешено (т.е. есть некоторые данные, возвращаемые запросом, или есть ошибка).
Итак, вы не можете написать:
console.log(getToken());
Что вы можете написать:
getToken()
.then(data => console.log('Data:', data))
.catch(error => console.log('Error:', error));
Но только когда вы действительно вернете обещание от своей функции:
function getToken() {
let promise = request(options);
return promise;
}
Теперь вы можете использовать ключевое слово async
и сделать что-то вроде этого:
async function getToken() {
let data = await request(options);
return data;
}
но эта функция не возвращает data
- она возвращает обещание точно так же, как в предыдущем примере.
Помните одно, что вы не можете вернуть какое-либо значение из вашей функции, которая пока недоступна. Вы можете вернуть обещание только в том случае, если хотите вернуть что-то еще до его появления. И каждая асинхронная функция - будь то async function
, функция, которая явно возвращает обещание или функцию, которая выполняет обратный вызов, вернется до того, как будет выполнено асинхронное действие, без блокировки потока.
Подробнее см. некоторые из этих ответов:
- Подробное объяснение того, как использовать обратные вызовы и promises
- Объяснение того, как использовать promises в сложных обработчиках запросов
- Объяснение того, что на самом деле представляет собой обещание, на примере запросов AJAX
- Объяснение обратных вызовов, promises и способ доступа к данным, возвращаемым асинхронно