JavaScript ditandai dengan asinkron. JavaScript tidak bisa menunggu. Jika Anda menerapkan sesuatu yang perlu ditunggu, Anda tidak dapat berhenti di situ dan menunggu hasilnya kembali. Sebaliknya, intinya adalah menggunakan panggilan balik panggilan balik: Anda mendefinisikan fungsi, yang hanya dapat dipanggil sampai hasilnya tersedia.
Model callback ini tidak memiliki masalah dengan organisasi kode yang baik, tetapi juga dapat menyelesaikan banyak masalah dengan beralih dari panggilan balik asli untuk menjanjikan. Perlakukan janji sebagai wadah data standar, yang akan menyederhanakan organisasi kode Anda dan menjadi arsitektur berbasis janji.
Apa itu janji?
Janji adalah objek dengan metode ".then (), yang mewakili hasil operasi yang mungkin belum diketahui. Tidak peduli siapa yang mengakses objek ini, ia dapat menggunakan metode ".then ()" untuk menambahkan panggilan balik untuk menunggu pengingat menunggu operasi memiliki hasil atau kegagalan yang sukses.
Jadi mengapa manfaat melakukan ini lebih baik daripada panggilan balik? Mode panggilan balik standar mengharuskan kami menyediakan fungsi panggilan balik secara bersamaan saat memproses permintaan:
permintaan (url, fungsi (kesalahan, respons) {// menangani keberhasilan atau kesalahan.}); dosomethingelse ();Sayangnya, kode ini berarti bahwa fungsi permintaan ini tidak tahu kapan akan diselesaikan dengan sendirinya, dan tentu saja itu tidak perlu. Kami akhirnya melewati hasilnya melalui panggilan balik. Ini menyebabkan beberapa panggilan balik untuk membentuk panggilan balik bersarang, atau perangkap panggilan balik.
querythedatabase (kueri, fungsi (kesalahan, hasil) {request (url, function (error, response) {dosomethingelse (respons, function (error, hasil) {doanotherthing (hasil, fungsi (error, hasil) {request (lain, fungsi, respons) {...});});});});Janji dapat menyelesaikan masalah ini dengan memungkinkan kode tingkat rendah untuk membuat permintaan dan kemudian mengembalikan objek, yang mewakili operasi yang belum selesai, memungkinkan penelepon untuk memutuskan panggilan balik mana yang harus ditambahkan.
Apa itu janji?
Janji adalah abstraksi dari pemrograman asinkron. Ini adalah objek proxy yang mengembalikan nilai atau melempar pengecualian. Secara umum, objek janji memiliki metode kemudian. Metode ini adalah bagaimana kita mendapatkan nilai pengembalian (nilai hasil dari implementasi yang berhasil dari janji disebut pemenuhan) atau melemparkan pengecualian (alasan untuk menolak janji disebut penolakan). Kemudian, gunakan dua panggilan balik opsional sebagai parameter, yang dapat kita sebut onfulfilled dan onrejected:
var janji = dosomethingaync ()
janji.
Ketika janji ini diselesaikan, yaitu, setelah proses asinkron selesai, baik yang dipenuhi dan satu kali akan dipanggil.
Oleh karena itu, janji memiliki tiga negara bagian berikut:
■ Tertunda untuk Dijanjikan - Keadaan Janji Awal
■ Komitmen Implementasi yang Dipenuhi-Komitmen Status Implementasi Keberhasilan
■ Ditolak penolakan terhadap komitmen - keadaan di mana janji gagal
Mengambil file baca sebagai kasus, berikut ini adalah apa yang harus dilakukan setelah membaca file menggunakan panggilan balik (pencetakan output):
readFile (function (err, data) {if (err) return console.error (err) console.log (data)})Jika fungsi ReadFile kami mengembalikan janji, maka kami dapat mengimplementasikan logika yang sama seperti berikut (pencetakan output):
var janji = readfile ()
Promise.then (Console.log, Console.Error)
Di sini kami memiliki janji nilai yang mewakili operasi yang tidak sinkron. Kita dapat melewati janji nilai ini sepanjang waktu. Siapa pun yang mengakses nilai ini dapat digunakan kemudian untuk mengkonsumsinya. Terlepas dari apakah operasi asinkron yang diwakili oleh nilai ini diselesaikan atau tidak selesai, kami juga dapat memastikan bahwa hasil asinkron tidak akan berubah, karena operasi asinkron yang diwakili oleh janji ini hanya akan dieksekusi sekali, dan negara dipenuhi atau ditolak.
Memahami janji
Janji mungkin berbeda dari intuisi harian. Untuk memahaminya, beberapa prinsip penting harus diingat: .then () selalu mengembalikan janji baru. Seperti yang ditunjukkan dalam kode berikut:
var janji = readfile ()
var janji2 = janji.
Di sini parameter waktu readanotherfile, konsol. TERROSENSI mewakili tindakan yang dipenuhi setelah operasi asinkron berhasil atau tindakan yang dilaporkan setelah kegagalan berhasil. Dengan kata lain, setelah fungsi requyototherfile dieksekusi, jika tidak catatan cetak yang gagal tidak benar. Implementasi ini hanya mungkin dalam dua cara.
Mari kita lihat kode berikut:
var janji = readfile () var janji2 = janji.then (function (data) {return readanotherfile () // Jika readfile berhasil, jalankan readanotherfile}, function (err) {console.error (err) /jika readfile tidak berhasil, merekamnya, tetapi masih mengeksekusi readanotherfile readanotherfile (), console. Hasil Eksekusi Fungsi RequyotherfileKarena kemudian mengembalikan janji, itu berarti bahwa janji dapat dihabiskan dengan merantai rantai serial, yang dapat menghindari neraka callback:
readfile () .then (readanotherfile) .then (dosomethingelse) .then (...)
Ada dua bagian dari aturan janji yang harus dipisahkan:
(1) .then () selalu mengembalikan janji baru. Setiap kali Anda menyebutnya, tidak masalah apa yang dilakukan panggilan balik, karena .then () sudah memberi Anda janji sebelum panggilan balik dipanggil. Perilaku panggilan balik hanya memengaruhi implementasi janji janji. Jika panggilan balik mengembalikan nilai, maka janji akan menggunakan nilai itu. Jika nilai ini adalah janji, kembalikan nilai setelah implementasi janji ke nilai ini. Jika panggilan balik melakukan kesalahan, janji akan menolak kesalahan.
(2) Janji yang dikembalikan oleh .then () adalah janji baru, yang berbeda dari yang disebut. Rantai janji yang panjang kadang -kadang menyembunyikan fakta bahwa, apa pun yang terjadi, setiap. THEN () panggilan akan menghasilkan janji baru. Apa yang harus Anda perhatikan di sini adalah bahwa yang benar -benar perlu Anda pertimbangkan adalah bahwa panggilan terakhir Anda .then () dapat mewakili kegagalan, jadi jika Anda tidak menangkap kegagalan ini, mudah untuk menyebabkan pengecualian kesalahan Anda menghilang.
Beberapa orang berpikir bahwa panggilan rantai .then () sangat mirip dengan gaya fasih, tetapi rantai janji panjang akan membingungkan dan akhirnya dibagi menjadi fungsi yang bermakna:
function getTasks () {return $ http.get ('http://example.com/api/v1/tasks') .then (function (response) {return response.data;});} function getMytasks () {return getTasks () .then (function (taSks) {toFerass () {TOSTASKSKSS () .then (function (toksks) {powerass) {towerksks () .then (function (toksks) {towersass (). });}Dalam contoh ini, kedua fungsi masing -masing mendapatkan janji, membawa fungsi panggilan balik.
Janji yang menarik
Janji yang sama dapat menerima sejumlah panggilan balik. Ketika janji diselesaikan dan diimplementasikan, semua fungsi panggilan balik akan dipanggil. Selain itu, janji bahkan dapat menerima panggilan balik baru setelah diselesaikan dan diimplementasikan. Callback ini dapat dipanggil dengan cara normal, yang memungkinkan kita menggunakan callback untuk mengimplementasikan bentuk cache sederhana:
Var Taskspromise; function getTasks () {TaskPromise = TaskPromise || getTaskFromTheserver (); kembalikan TaskPromise;}Dalam hal ini, fungsi gettasks () dapat disebut beberapa kali, ia selalu mengembalikan janji gigi tembaga, di mana fungsi gettasksfromtheserver () hanya dipanggil sekali.
Penggunaan janji nodej di atas adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.