Это сложно, и я не обвиняю вас в том, что вы в замешательстве. Все, кто новичок в 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
, функция, которая явно возвращает обещание или функцию, которая выполняет обратный вызов, вернется до того, как будет выполнено асинхронное действие, без блокировки потока.
Для получения более подробной информации см некоторые из этих ответов:
Возможный дубликат [Как вернуть ответ от асинхронного звоните] (HTTP: // StackOverflow.com/questions/14220321/how-do-i-return-the-response-from-a-асинхронный вызов) – dNitro
Код не является минимальным рабочим примером, поэтому трудно помочь – ecc
@ dNitro, не уверен, что его больше ajax но, возможно, это то же самое? – ValDaHus