Promise akan selalu masuk dalam log selama hasilnya belum diselesaikan. Anda harus .then
memenuhi 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 Promise
diteruskan ke metode .then
atau 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 .then
handler mengembalikan nilai, maka Promise
penyelesaian dengan nilai itu. Jika handler mengembalikan yang lain Promise
, maka yang asli Promise
menyelesaikan dengan nilai yang dirantai Promise
. .then
Penangan berikutnya akan selalu berisi nilai yang diselesaikan dari janji berantai yang dikembalikan sebelumnya .then
.
Cara kerjanya dijelaskan lebih rinci di bawah ini:
1. Kembalinya .then
fungsi 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 .then
fungsi 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"
});