Обещание всегда будет записываться в состояние ожидания, пока его результаты еще не разрешены. Вы должны вызвать .then
обещание для захвата результатов независимо от состояния обещания (разрешено или все еще ожидает выполнения):
let AuthUser = function(data) {
return google.login(data.username, data.password).then(token => { return token } )
}
let userToken = AuthUser(data)
console.log(userToken) // Promise { <pending> }
userToken.then(function(result) {
console.log(result) // "Some User token"
})
Это почему?
Обещания - это только прямое направление; Вы можете решить их только один раз. Разрешенное значение a Promise
передается его.then
или .catch
методам.
подробности
Согласно спецификации Promises / A +:
Процедура разрешения обещания - это абстрактная операция, принимающая в качестве входных данных обещание и значение, которое мы обозначаем как [[Resolve]] (обещание, x). Если x является пригодным для использования, он пытается заставить обещание принять состояние x, при условии, что x ведет себя, по крайней мере, в некоторой степени как обещание. В противном случае он выполняет обещание со значением x.
Такая обработка таблиц позволяет взаимодействовать реализациям обещаний при условии, что они предоставляют метод then, соответствующий Promises / A +. Это также позволяет реализациям Promises / A + «ассимилировать» несовместимые реализации с разумными тогда методами.
Эту спецификацию немного сложно разобрать, поэтому давайте разберемся с ней. Правило такое:
Если функция в .then
обработчике возвращает значение, то Promise
разрешается с этим значением. Если обработчик возвращает другой Promise
, то исходный Promise
разрешается с разрешенным значением связанного Promise
. Следующий .then
обработчик всегда будет содержать разрешенное значение связанного обещания, возвращенного в предыдущем .then
.
Как это работает на самом деле, более подробно описано ниже:
1. Возврат .then
функции будет разрешенным значением обещания.
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return "normalReturn";
})
.then(function(result) {
console.log(result); // "normalReturn"
});
2. Если .then
функция возвращает a Promise
, то разрешенное значение этого связанного обещания передается следующему .then
.
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("secondPromise");
}, 1000)
})
})
.then(function(result) {
console.log(result); // "secondPromise"
});