Promise akan selalu masuk dalam log selama hasilnya belum diselesaikan. Anda harus .thenmemenuhi janji untuk menangkap hasil terlepas dari status janji (diselesaikan atau masih menunggu keputusan):
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"
})
Mengapa demikian?
Janji hanya mengarah ke depan; Anda hanya dapat menyelesaikannya satu kali. Nilai yang diselesaikan dari a Promisediteruskan ke metode .thenatau nya .catch.
Detail
Menurut spesifikasi Promises / A +:
Prosedur penyelesaian janji adalah operasi abstrak yang mengambil sebuah janji dan nilai sebagai masukan, yang kami nyatakan sebagai [[Selesaikan]] (janji, x). Jika x adalah a thenable, ia mencoba membuat promise mengadopsi status x, dengan asumsi bahwa x berperilaku setidaknya seperti sebuah promise. Jika tidak, itu memenuhi janji dengan nilai x.
Perlakuan terhadap tabel ini memungkinkan implementasi promise untuk beroperasi, selama mereka mengekspos metode Promises / A + -compliant then. Ini juga memungkinkan implementasi Promises / A + untuk "mengasimilasi" implementasi yang tidak sesuai dengan metode yang masuk akal.
Spesifikasi ini agak sulit diurai, jadi mari kita uraikan. Aturannya adalah:
Jika fungsi di .thenhandler mengembalikan nilai, maka Promisepenyelesaian dengan nilai itu. Jika handler mengembalikan yang lain Promise, maka yang asli Promisemenyelesaikan dengan nilai yang dirantai Promise. .thenPenangan berikutnya akan selalu berisi nilai yang diselesaikan dari janji berantai yang dikembalikan sebelumnya .then.
Cara kerjanya dijelaskan lebih rinci di bawah ini:
1. Kembalinya .thenfungsi akan menjadi nilai yang dijanjikan.
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. Jika .thenfungsi mengembalikan a Promise, maka nilai yang diselesaikan dari janji berantai tersebut akan diteruskan ke berikut ini .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"
});