結果がまだ解決されていない限り、promiseは常に保留中のログを記録します。.then
promiseの状態(解決済みまたは保留中)に関係なく結果をキャプチャするには、promiseを呼び出す必要があります。
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"
})
何故ですか?
約束は順方向のみです。解決できるのは1回だけです。aの解決された値は、Promise
その.then
or .catch
メソッドに渡されます。
細部
Promises / A +仕様によると:
promiseの解決手順は、promiseと値を入力として受け取る抽象的な操作であり、[[Resolve]](promise、x)と表記します。xがthenableである場合、xは少なくともいくらかpromiseのように動作するとの仮定の下で、promiseにxの状態を採用させようとします。それ以外の場合は、値xでpromiseを満たします。
thenablesのこの処理により、Promises / A +準拠のthenメソッドが公開されている限り、promise実装を相互運用できます。また、Promises / A +実装は、妥当なthenメソッドを使用して、非準拠の実装を「同化」することができます。
この仕様は解析が少し難しいので、分解してみましょう。ルールは:
.then
ハンドラーの関数が値を返す場合、Promise
その値で解決されます。ハンドラーが別のハンドラーを返す場合、Promise
オリジナルPromise
はチェーンされた解決済みの値で解決されますPromise
。次の.then
ハンドラーには常に、前ので返されたチェインされたpromiseの解決された値が含まれます.then
。
実際に機能する方法を以下で詳しく説明します。
1. .then
関数の戻り値は、promiseの解決された値になります。
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
関数がを返す場合、Promise
そのチェーンされた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"
});