Saya melihat contoh ini dari dokumen Angular, $q
tetapi saya pikir ini mungkin berlaku untuk janji secara umum. Contoh di bawah ini disalin kata demi kata dari dokumen mereka dengan komentar mereka termasuk:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
Saya tidak jelas bagaimana ini bekerja. Jika saya bisa memanggil .then()
hasil yang pertama .then()
, merantai mereka, yang saya tahu saya bisa, maka itu promiseB
adalah objek janji, tipe Object
. Itu bukan Number
. Jadi apa yang mereka maksud dengan "nilainya akan menjadi hasil dari janji yang bertambah 1"?
Apakah saya seharusnya mengaksesnya sebagai promiseB.value
atau sesuatu seperti itu? Bagaimana panggilan balik yang berhasil mengembalikan janji DAN mengembalikan "hasil +1"? Saya melewatkan sesuatu.
javascript
angularjs
promise
angular-promise
temporary_user_name
sumber
sumber
Jawaban:
promiseA
'sthen
mengembalikan fungsi janji baru (promiseB
) yang segera diselesaikan setelahpromiseA
teratasi, nilainya adalah nilai dari apa yang dikembalikan dari fungsi sukses dalampromiseA
.Dalam hal
promiseA
ini diselesaikan dengan nilai -result
dan kemudian segera diselesaikan denganpromiseB
nilairesult + 1
.Mengakses nilai
promiseB
dilakukan dengan cara yang sama kita mengakses hasilpromiseA
.Edit Desember 2019 :
async
/await
sekarang standar dalam JS, yang memungkinkan sintaks alternatif untuk pendekatan yang dijelaskan di atas. Anda sekarang dapat menulis:Sekarang tidak ada janji B, karena kami telah membuka hasil dari janji menggunakan
await
, dan Anda dapat bekerja secara langsung.Namun,
await
hanya bisa digunakan di dalam suatuasync
fungsi. Jadi untuk memperkecil sedikit, hal di atas harus terkandung seperti:sumber
Ketika sebuah janji diselesaikan / ditolak, itu akan memanggil penangan keberhasilan / kesalahannya:
The
then
Metode juga mengembalikan janji: promiseB, yang akan diselesaikan / ditolak tergantung pada nilai kembali dari handler keberhasilan / error dari promiseA .Ada tiga nilai yang mungkin bahwa penangan keberhasilan / kesalahan yang dijanjikan dapat kembali yang akan mempengaruhi hasil yang menjanjikan:
Berbekal pemahaman ini, Anda dapat memahami hal-hal berikut:
Kemudian panggilan mengembalikan janji B segera. Ketika janjiA dipecahkan, itu akan melewati hasilnya untuk penangan sukses janjiA. Karena nilai pengembalian adalah hasil janjiA + 1, penangan keberhasilan mengembalikan nilai (opsi 2 di atas), jadi janjiB akan menyelesaikan segera, dan penangan keberhasilan janjiB akan diteruskan hasil janjiA +1 +.
sumber
.then
fungsi janjiB menerima apa yang dikembalikan dari.then
fungsi janjiA.di sini, janji kembali adalah angka, yang akan tersedia sebagai
number
parameter dalam fungsi keberhasilan janji. yang kemudian akan bertambah 1sumber
Memilah komentar sedikit berbeda dari pengertian Anda saat ini mungkin membantu:
Ini menyatakan bahwa itu
promiseB
adalah janji tetapi akan diselesaikan segera setelahpromiseA
diselesaikan. Cara lain untuk melihat ini berartipromiseA.then()
mengembalikan janji yang ditugaskanpromiseB
.Ini berarti bahwa nilai yang
promiseA
diselesaikan adalah nilai yangpromiseB
akan menerima sebagai nilai successCallback-nya:sumber
jawaban pixelbits benar dan Anda harus selalu menggunakan
.then()
untuk mengakses nilai janji dalam kode produksi.Namun, ada cara untuk mengakses nilai janji secara langsung setelah diselesaikan dengan menggunakan simpul.js internal yang tidak didukung berikut ini:
PERINGATAN: process.binding tidak pernah dimaksudkan untuk digunakan di luar inti nodejs dan tim inti nodejs secara aktif mencari untuk menghentikannya
https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064
sumber
Contoh ini saya temukan cukup jelas. Perhatikan bagaimana menunggu menunggu hasilnya dan Anda kehilangan Janji yang dikembalikan.
sumber
sumber
Anda dapat dengan mudah melakukannya menggunakan metode tunggu async dalam javascript.
Di bawah ini adalah contoh mengambil nilai janji WebRTC menggunakan batas waktu.
sumber
Di Node REPL, untuk mendapatkan koneksi DB yang merupakan nilai janji, saya mengambil pendekatan berikut:
Garis dengan
await
biasanya akan mengembalikan janji. Kode ini dapat disisipkan ke dalam Node REPL atau jika disimpan diindex.js
dalamnya dapat dijalankan di Bash denganyang membuat Anda di Node REPL setelah menjalankan skrip dengan akses ke variabel yang ditetapkan. Untuk mengonfirmasi bahwa fungsi asinkron telah kembali, Anda dapat login
connection
misalnya, dan kemudian Anda siap untuk menggunakan variabel. Salah satu tentu saja tidak ingin mengandalkan fungsi asinkron yang sedang diselesaikan untuk kode apa pun dalam skrip di luar fungsi asinkron.sumber
Ada beberapa jawaban yang baik di atas dan di sini adalah versi fungsi ES6 Arrow
sumber
Saya seorang pembelajar lambat javascript janji, secara default semua fungsi async mengembalikan janji, Anda dapat membungkus hasil Anda sebagai:
" Ekspresi menunggu menyebabkan eksekusi fungsi async untuk berhenti sampai Janji diselesaikan (yaitu, dipenuhi atau ditolak), dan untuk melanjutkan eksekusi fungsi async setelah pemenuhan. Ketika dilanjutkan, nilai dari ekspresi menunggu adalah nilai dari Janji yang dipenuhi. Jika Janji ditolak, ekspresi tunggu melempar nilai yang ditolak ."
Baca lebih lanjut tentang menunggu dan berjanji di MDN Web Documents
sumber
Mungkin contoh kode skrip kecil ini akan membantu.
Di sini
repository.get(id)
pengembaliannya aPromise<Account>
. Saya menetapkannya ke variabelaccount
dalamthen
pernyataan.sumber