Obietnica będzie zawsze rejestrowana, dopóki jej wyniki nie zostaną jeszcze rozwiązane. Niezależnie od stanu obietnicy (rozwiązany lub w toku) należy wywołać .then
na obietnicy się uchwycić wyniki:
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) //will log results.
})
dlaczego tak jest?
obietnice są tylko w przód, można je rozwiązać tylko raz, a ich wartość można przekazać tylko do .then /.złapać
Szczegóły
istnieje nieporozumienie w sekcji komentarzy na jedną odpowiedź poniżej temat zwrotu następnie powróci do tylko jego funkcji, ostatecznie nic nie robi. .then(token => { return token; })
Cytowanie zostały argument jest (przejście go, aby upewnić się nikt nie myśli, że to jest poprawna)
Ultimately your callback token => { return token; } does nothing; instead, your input to then() needs to be a function that actually handles the token in some way.
Zgodnie z obietnicami/A + specyfikacji:
The promise resolution procedure is an abstract operation taking as input a promise and a value, which we denote as [[Resolve]](promise, x). If x is a thenable, it attempts to make promise adopt the state of x, under the assumption that x behaves at least somewhat like a promise. Otherwise, it fulfills promise with the value x.
This treatment of thenables allows promise implementations to interoperate, as long as they expose a Promises/A+-compliant then method. It also allows Promises/A+ implementations to “assimilate” nonconformant implementations with reasonable then methods.
Ten szczegół realizacja jest mało trudny do przeanalizowania, więc możemy go rozbić.
Reguła jest taka, że jeśli funkcja, która jest w procedurze obsługi, zwraca wartość, obietnica rozpatruje/odrzuca tę wartość, a jeśli funkcja zwraca obietnicę, to co się stanie, następna klauzula będzie wtedy klauzula obietnicy zwraca tę funkcję, więc w tym przypadku pierwszy przykład przechodzi przez normalną sekwencję thens i wypisuje wartości, jak można się było spodziewać, w drugim przykładzie, obiekt obietnicy, który zostanie zwrócony, gdy wykonasz Obietnicę. resolve ("bbb") to wtedy jest wywoływane podczas łączenia (dla wszystkich intencji i celów). Sposób, w jaki faktycznie działa, opisano bardziej szczegółowo poniżej.
1. Zwrot z funkcji .then
będzie wartością rozstrzygnięcia obietnicy.
Przykład:
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 funkcja .then
zwraca obietnicę, wówczas postanowienie o jego obietnicy będzie rozwiązać jego najbliższego .then
zasadzie.
Przykład:
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"
});
Jest to obietnica. Obietnica nie jest realizowana zaraz po jej utworzeniu. Dlatego nazywa się to obietnicą. Obiecuje zrobić coś później. –
@ LoïcFaure-Lacroix, zobacz ten artykuł: https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8#.w234uo7h3 – Src
@ LoïcFaure-Lacroix spójrz na 'getFirstUser' function – Src