Обещание всегда будет записываться в состояние ожидания, пока его результаты еще не разрешены. Вы должны вызвать .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"
});