Kode saya:
let AuthUser = data => {
return google.login(data.username, data.password).then(token => { return token } )
}
Dan ketika saya mencoba menjalankan sesuatu seperti ini:
let userToken = AuthUser(data)
console.log(userToken)
Saya mendapatkan:
Promise { <pending> }
Tapi kenapa?
Tujuan utama saya adalah mendapatkan token google.login(data.username, data.password)
yang mengembalikan janji, menjadi variabel. Dan baru kemudian melakukan beberapa tindakan.
getFirstUser
fungsinyaJawaban:
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):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 +:
Spesifikasi ini agak sulit diurai, jadi mari kita uraikan. Aturannya adalah:
Jika fungsi di
.then
handler mengembalikan nilai, makaPromise
penyelesaian dengan nilai itu. Jika handler mengembalikan yang lainPromise
, maka yang asliPromise
menyelesaikan dengan nilai yang dirantaiPromise
..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.2. Jika
.then
fungsi mengembalikan aPromise
, maka nilai yang diselesaikan dari janji berantai tersebut akan diteruskan ke berikut ini.then
.sumber
Uncaught SyntaxError: Unexpected token .
. Yang kedua perlu dikembalikan untukPromise
.then
menggunakan fungsi yang tidak dipanggil. memperbarui jawabannyaSaya tahu pertanyaan ini ditanyakan 2 tahun yang lalu, tetapi saya mengalami masalah yang sama dan jawaban untuk masalahnya adalah sejak ES6, bahwa Anda dapat dengan mudah
await
mengembalikan nilai fungsi, seperti:sumber
.then(token => return token)
, itu hanya passthrough yang tidak perlu. Cukup kembalikan panggilan masuk Google.await
luar fungsi async. Mungkin contoh yang lebih baik di sini adalah membuatAuthUser
fungsinyaasync
, yang kemudian diakhiri denganreturn await google.login(...);
The
then
kembali metode janji yang tertunda yang dapat diselesaikan asynchronously dengan nilai kembali dari penangan hasil terdaftar dalam panggilan untukthen
, atau ditolak dengan melemparkan kesalahan dalam penangan disebut.Jadi, pemanggilan
AuthUser
tidak akan mendadak memasukkan pengguna secara sinkron, tetapi mengembalikan sebuah promise yang penangannya yang terdaftar akan dipanggil setelah login berhasil (atau gagal). Saya menyarankan untuk memicu semua proses masuk denganthen
klausul janji masuk. EG menggunakan fungsi bernama untuk menyoroti urutan aliran:sumber
Lihat bagian MDN tentang Janji. Secara khusus, lihat jenis kembalian dari then ().
Untuk masuk, agen pengguna harus mengirimkan permintaan ke server dan menunggu untuk menerima tanggapan. Karena membuat aplikasi Anda benar-benar menghentikan eksekusi selama permintaan bolak-balik biasanya menghasilkan pengalaman pengguna yang buruk, hampir setiap fungsi JS yang memasukkan Anda (atau melakukan bentuk interaksi server lainnya) akan menggunakan Promise, atau sesuatu yang sangat mirip dengannya , untuk memberikan hasil secara asinkron.
Sekarang, perhatikan juga bahwa
return
pernyataan selalu dievaluasi dalam konteks fungsi kemunculannya. Jadi ketika Anda menulis:pernyataan itu
return token;
berarti bahwa fungsi anonim yang diteruskanthen()
harus mengembalikan token, bukanAuthUser
fungsi yang seharusnya. ApaAuthUser
mengembalikan adalah hasil dari panggilangoogle.login(username, password).then(callback);
, yang terjadi menjadi Promise.Pada akhirnya panggilan balik Anda
token => { return token; }
tidak melakukan apa pun; sebaliknya, masukan Andathen()
ke harus berupa fungsi yang benar-benar menangani token dalam beberapa cara.sumber
return
diperlakukan dengan sintaksis penutupan (ish) yang baru, dalam hal ini - saya sangat tidak setuju, tetapi kesalahan itu masih milik saya dan saya minta maaf untuk itu.token => { return token; }
tidak ada yang bertentangan dengan klaim itu kontraproduktif. Anda dapat mengatakangoogle.login(username, password).then(token=>{return token;}).then(token=>{return token;})
dan seterusnya selamanya, tetapi Anda hanya akan mencapai pengembalianPromise
yang diselesaikan dengan token — sama seperti jika Anda membiarkannya begitu sajagoogle.login(username, password);
. Saya tidak yakin mengapa Anda merasa ini "sangat salah".return token
tidak bekerja seperti yang diharapkan OP.promise.then(result => { return result; })
persis sama denganpromise
, oleh karena itu pemanggilan metode tidak melakukan apa pun dan harus dibuang untuk menyederhanakan kode dan meningkatkan keterbacaan - pernyataan yang sepenuhnya benar.Janji Anda menunggu, selesaikan dengan
setelah kode Anda yang tersisa. Semua yang dilakukan kode ini adalah yang
.then()
memenuhi janji Anda & menangkap hasil akhir dalam variabel hasil & hasil cetak di konsol. Perlu diingat, Anda tidak dapat menyimpan hasil dalam variabel global. Semoga penjelasan itu bisa membantu Anda.sumber