Obietnica będzie zawsze rejestrowana jako oczekująca, o ile jej wyniki nie zostaną jeszcze rozwiązane. Musisz odwołać .then
się do obietnicy, aby uchwycić wyniki niezależnie od stanu obietnicy (rozwiązany lub wciąż oczekujący):
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"
})
Dlaczego?
Obietnice dotyczą tylko kierunku naprzód; Możesz je rozwiązać tylko raz. Rozstrzygnięta wartość a Promise
jest przekazywana do jej metod .then
lub .catch
.
Detale
Zgodnie ze specyfikacją Promises / A +:
Procedura rozstrzygania obietnic jest abstrakcyjną operacją przyjmującą jako dane wejściowe obietnicę i wartość, którą oznaczamy jako [[Rozwiąż]] (obietnica, x). Jeśli x jest zdolny do działania, to stara się, aby obietnica przyjęła stan x, przy założeniu, że x zachowuje się przynajmniej trochę jak obietnica. W przeciwnym razie spełnia obietnicę o wartości x.
Takie traktowanie elementów umożliwia współpracę obiecujących implementacji, o ile ujawniają one następnie metodę Promises / A +. Pozwala również implementacjom Promises / A + na „asymilację” niezgodnych implementacji z rozsądnymi metodami.
Ta specyfikacja jest trochę trudna do przeanalizowania, więc podzielmy ją. Zasada jest taka:
Jeśli funkcja w programie .then
obsługi zwraca wartość, to jest Promise
rozwiązywana z tą wartością. Jeśli przewodnik zwróci inny Promise
, oryginał zostanie Promise
rozstrzygnięty z rozstrzygniętą wartością łańcucha Promise
. Następny .then
program obsługi zawsze będzie zawierał rozstrzygniętą wartość połączonej obietnicy zwróconej w poprzednim .then
.
Sposób, w jaki to faktycznie działa, opisano bardziej szczegółowo poniżej:
1. Zwrot .then
funkcji będzie ustaloną wartością promesy.
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. Jeśli .then
funkcja zwraca a Promise
, to rozwiązana wartość tej połączonej obietnicy jest przekazywana do następującego .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"
});