JavaScript menjanjikan tutorial dengan contoh
- 2425
- 19
- John Ratke
Sementara sebelumnya tersedia melalui perpustakaan pihak ketiga, janji -janji diperkenalkan dalam JavaScript, sebagai penduduk asli
fitur, dengan ecmascript6.
Mereka memberikan alternatif untuk panggilan balik saat berhadapan dengan kode asinkron, menyediakan,
Di antara hal -hal lain, cara yang lebih bersih untuk menangani kesalahan. Dalam tutorial ini kita akan melihat bagaimana janji bekerja, bagaimana caranya
buat mereka dan cara menggunakan metode mereka.
Dalam tutorial ini Anda akan belajar:
- Apa janji javascript.
- Cara membuat janji javascript.
- Bagaimana janji dapat digunakan untuk mengelola kode asinkron.
- Metode apa yang dapat digunakan dengan janji.
Persyaratan dan konvensi perangkat lunak yang digunakan
Kategori | Persyaratan, konvensi atau versi perangkat lunak yang digunakan |
---|---|
Sistem | Sistem Operasi Agnostik. |
Perangkat lunak | Pemasangan node untuk mengikuti tutorial ini di lingkungan non-browser. |
Lainnya | Pengetahuan tentang konsep berorientasi javascript dan objek. |
Konvensi | # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa |
Apa itu "janji"?
Dalam JavaScript, a janji
adalah objek yang dikembalikan sebagai hasilnya
Operasi asinkron, non -pemblokiran, seperti itu, misalnya, yang dilakukan oleh mengambil
fungsi builtin. Janji diperkenalkan sebagai fitur asli, dengan Ecmascript6
: Mereka mewakili a
alternatif yang lebih bersih untuk panggilan balik, berkat fitur seperti rantai metode dan fakta bahwa mereka menyediakan a
cara mengelola kesalahan yang menyerupai penanganan pengecualian dalam kode sinkron. Ada tiga negara bagian yang dijanjikan
bisa masuk:
- Tertunda
- Terselesaikan
- Ditolak
Seperti namanya, kami mengatakan bahwa janji itu tertunda
ketika hasilnya belum diputuskan,
jadi masih bisa diselesaikan atau ditolak. Kami mengatakan bahwa janji itu terpenuhi
Saat asinkron
Operasi telah berhasil: janji telah diselesaikan, dan berisi hasil operasi itu sendiri.
Akhirnya, janji dikatakan ditolak
Ketika operasi asinkron gagal: dalam hal ini
Janji akan berisi alasan kegagalan.
Membuat janji JavaScript
Seperti disebutkan di atas, beberapa fungsi yang melakukan operasi asinkron, seperti mengambil
, kembali
janji secara default, jadi kita dapat menggunakan metode dan pola yang akan kita jelaskan nanti dalam tutorial ini di luar kotak ini. Fungsi lainnya
Belum mendukung janji, jadi kami mungkin ingin membuat janji di sekitar mereka. Konstruktor janji mengambil satu argumen,
yang merupakan fungsi panggilan balik yang itu sendiri, mengambil dua argumen: menyelesaikan
Dan menolak
Callbacks, yang
dipanggil untuk menyelesaikan atau menolak janji, masing -masing. Mari kita lihat contoh cepat tentang cara membuat janji sepele:
const janji = new janji (fungsi (resolve, reject) setTimeout (resolve, 100, 'success!'); );
Dengan kode di atas, kami membuat janji, yang sebenarnya akan selalu diselesaikan, karena dengan menggunakansetTimeout
fungsi, kami memanggil menyelesaikan
panggilan balik setelah waktu tunggu 100 milidetik,
Melewati string “Sukses!“Sebagai satu -satunya argumen panggilan balik. Dengan cara yang sama, jika kita menginginkan janji itu
untuk ditolak, kita seharusnya memohon menolak
panggilan balik. Jelas janji seperti
Satu di atas tidak terlalu berguna bagi kami, jadi kami sekarang akan mencoba membuat janji di sekitar fungsi yang benar -benar berguna.
Itu ReadFile
metode FS
modul, secara tidak sinkron membaca konten file, dan
mengambil tiga argumen: dua di antaranya wajib, dan satu opsional. Argumen pertama adalah jalur file
untuk dibaca. Argumen kedua adalah opsional, dan dengan itu, kita dapat, misalnya, menentukanPengkodean
untuk digunakan. Argumen ketiga adalah fungsi panggilan balik, yang dengan sendirinya mengambil dua argumen:berbuat salah
Dan data
.
Jika operasi yang dibaca gagal, argumen pertama akan berisi Kesalahan
objek dan yang kedua tidak akan ditentukan; Jika operasi berhasil, sebagai gantinya, argumen kedua adalah a
String mewakili konten file, atau buffer mentah jika tidak ada pengkodean yang ditentukan, sedangkan argumen pertama akan
menjadi batal
. Katakan misalnya saya ingin membaca saya .Vimrc
file menggunakan fungsi ini:
const fs = membutuhkan ('fs'); FS.readfile ('.vimrc ',' utf-8 ', function (err, data) if (err) throw err konsol.log (data));
Pertama -tama kami membutuhkan FS
modul dan ditugaskan ke FS
konstan, dari
Kami melanjutkan memohon ReadFile
metode. Dalam panggilan balik yang diterima sebagai argumen terakhir dari fungsi tersebut, kami tampil
operasi yang dibutuhkan tergantung pada hasil yang diperoleh. Dalam kode di atas kami melemparkan
pengecualian jika terjadi kesalahan
Saat mencoba membaca file, sementara kami hanya mencetak konten file jika semuanya berjalan seperti yang diharapkan. Dalam hal ini ini akan terjadi
hasil (terpotong):
[…] Set fileformat = unix Set TextWidth = 79 Set Noswapfile Set FoldMethod = Indent Set FoldLevel = 99 Set SplitRight Set SplitBelow Set HlSearch Set IncSearch Set Ignorecase Set SmartCase [...]
Metode yang baru saja kami gunakan, ReadFile
, melakukan operasi baca secara tidak sinkron, jadi tidak menghalangi. Secara default, tidak,
Namun, janji dukungan. Jika kita ingin "menjanjikan" penggunaan metode ini, kita harus membuat janji di sekitarnya sendiri:
const fs = membutuhkan ('fs'); fungsi readFilePromise (filepath) return new janji (function (resolve, reject) fs.readFile (filepath, 'utf-8', function (err, data) if (err) reject (err); else resolve (data);); );
Lihatlah kode di atas, apa yang telah kita ubah? Kami menciptakan readfilepromise
Fungsi: di dalamnya
janji berdasarkan hasil dari FS.ReadFile
Metode dibuat dan dikembalikan. Dalam contoh sebelumnya,
Kami menyesuaikan kode untuk melempar pengecualian jika kesalahan dalam operasi baca ada: dalam hal ini, sebagai gantinya, karena kami
sedang membangun janji, jika terjadi kesalahan, kami memanggil menolak
Callback, meneruskan kesalahan sebagai argumen satu -satunya,
Dengan cara ini menolak janji. Jika operasi baca dilakukan dengan sukses, sebaliknya, kami menelepon menyelesaikan
, lewat
data yang dihasilkan dari operasi baca sebagai argumen, sehingga memenuhi janji. Di paragraf berikutnya kita akan melihat caranya
Untuk benar -benar mengkonsumsi janji yang baru saja kita buat.
Metode janji
Objek janji tidak ada gunanya jika kita tidak memiliki cara untuk berinteraksi dan mengkonsumsinya. Di bagian ini kami akan
Jelaskan metode yang dapat kita gunakan pada objek janji. Masing -masing metode ini bekerja dengan janji, dan pada gilirannya, mengembalikan janji
sendiri, memungkinkan kita membuat "tumpukan" dan melakukan metode rantai
.
Itu Kemudian metode
Itu Kemudian
Metode membutuhkan dua argumen, yang sebenarnya adalah dua panggilan balik untuk dieksekusi masing -masing saat janji
terpenuhi dan ketika ditolak, dan mengembalikan janji. Bertahan dengan contoh di atas, berikut adalah bagaimana kita bisa menggunakan metode ini
untuk berinteraksi dengan janji yang dikembalikan saat kita memanggil readfilepromise
fungsi:
readfilepromise ('.Vimrc ').Kemudian (fungsi onResolvecallback (data) konsol.log (data); , function onrejectcallback (alasan) konsol.Log ('Pesan kesalahan adalah $ Reason'); )
Saat janji keluar tertunda
menyatakan, dan dengan demikian diselesaikan atau ditolak, Kemudian
metode itu
dieksekusi. Jika janji diselesaikan, panggilan balik pertama (dalam hal ini kami menamai panggilan balik hanya untuk membuat lebih mudah untuk memahami peran mereka)
dieksekusi, argumennya memegang hasil operasi asinkron (dalam hal ini isi “.file vimrc ”sebagai string).
Jika janji ditolak, sebagai gantinya, panggilan balik kedua (kami menamakannya onREJECTCallback) akan dieksekusi: argumennya akan berisi kesalahan tersebut
yang menyebabkan operasi membaca gagal.
Itu menangkap metode
Tidak seperti Kemudian
, yang menangani keduanya saat janji diselesaikan dan ditolak, menangkap
Metode lebih spesifik,
dan hanya berurusan dengan kasus terakhir. Menggunakan metode ini setara dengan penggunaan Kemudian
dengan belum diartikan
sebagai
Argumen pertama, alih -alih panggilan balik yang digunakan untuk menangani kasus ketika janji dipenuhi, dan dengan panggilan balik yang valid untuk menangani
kasus saat janji ditolak, sebagai yang kedua. Metode ini mengembalikan janji, dan dengan menggunakannya, kita dapat menulis ulang kode di atas dengan cara ini:
readfilepromise ('.vimrc ') // di dalam' lalu 'kami mengelola kasus ketika janji terpenuhi, berurusan // dengan kemungkinan kesalahan di dalam' tangkap ' .lalu (fungsi (data) konsol.log (data); ) .catch (function (reason) konsol.Log ('Pesan kesalahan adalah $ Reason'); )
Amati bagaimana kami melampirkan menangkap
metode setelahnya Kemudian
: ini mungkin
Karena, seperti yang kami katakan di atas, setiap metode mengembalikan janji itu sendiri, dan karenanya dapat dirantai.
Itu Akhirnya metode
Sebagai metode yang kami lihat di atas, Akhirnya
mengembalikan janji. Itu selalu dieksekusi terlepas dari keadaan janji,
Baik jika diselesaikan atau ditolak. Untuk alasan ini, panggilan balik tidak ada argumen, karena ketika berjalan tidak ada cara untuk menentukan
Jika janji telah ditolak atau diselesaikan. Kami menggunakan metode ini ketika kami ingin menjalankan kode generik yang harus dijalankan dalam kasus apa pun.
readfilepromise ('.Vimrc ') .lalu (fungsi (data) konsol.log (data); ) .catch (function (reason) konsol.Log ('Pesan kesalahan adalah $ Reason'); ) .akhirnya (function () konsol.log ("Saya selalu dieksekusi!");)
Dalam contoh di atas, apakah janji itu diselesaikan atau ditolak, string “Saya selalu dieksekusi!“Ini dicetak di konsol.
Itu balapan metode
Metode ini mengambil iterable (misalnya array) sebagai argumennya. Itu mengembalikan janji yang diselesaikan atau ditolak segera setelah a
janji yang terkandung dalam iterable, ada negara yang tertunda, dan menjadi ditolak atau diselesaikan. Janji yang dikembalikan, akan memiliki
nilai pemenuhan atau alasan penolakan janji tersebut.
const p1 = janji baru (fungsi (resolve, reject) setTimeout (resolve, 100, 'diselesaikan!'); ); const p2 = janji baru (fungsi (resolve, reject) setTimeout (tolak, 50, 'ditolak!'); ); Janji.Race ([P1, P2]) .lalu (fungsi (data) konsol.log (data); ) .catch (function (reason) konsol.log (alasan); )
Dalam contoh ini kami membuat dua janji baru: yang pertama, P1
, akan diselesaikan setelah 100 milidetik;
yang kedua, P2
, akan ditolak setelah 50 milidetik. Kami melewati iterable yang berisi kedua janji sebagai
argumen tunggal tentang Janji.balapan
metode. Jika kami menjalankan kode di atas, kami mendapatkan hasil berikut:
ditolak!
Apa yang telah terjadi? Seperti yang diharapkan P2
Janji adalah yang pertama diselesaikan (ditolak), akibatnya janji
dikembalikan oleh Janji.balapan
metode, menolak dengan alasan yang sama. Seperti yang Anda lihat, keadaan janji tidak relevan:
yang pertama yang sebenarnya mendapat status selain tertunda
adalah salah satu yang penting.
Itu semua metode
Menyukai balapan
, itu semua
Metode mengambil iterable sebagai satu -satunya argumennya. Itu mengembalikan janji yang mana
akan menyelesaikan begitu semua janji yang terkandung dalam iterable akan menyelesaikan (atau ketika iterable tidak mengandung janji) atau akan
Tolak dengan alasan janji pertama di Iterable yang akan menolak. Misalnya:
const p1 = janji baru (fungsi (resolve, reject) setTimeout (resolve, 100, 'p1 diselesaikan!'); ) const p2 = janji baru (function (resolve, reject) setTimeout (resolve, 100, 'p2 diselesaikan!'); ) Janji.All ([P1, P2]) .lalu (fungsi (nilai) konsol.log (nilai); )
Kode di atas akan kembali:
['P1 diselesaikan!',' P2 menyelesaikan!']
Semua janji yang terkandung dalam iterable diselesaikan, jadi janji yang tertunda dikembalikan oleh semua
metode
diselesaikan juga, nilainya menjadi array yang berisi nilai -nilai dari semua janji yang diselesaikan. Jika seseorang (dan secepat) salah satu janji
Dalam penolakan yang dapat diulang, janji yang dikembalikan dengan metode itu juga, dengan alasan yang sama. Jika yang dapat dilewati seperti argumen
telah kosong, janji yang sudah diselesaikan akan dikembalikan. Jika iterable tidak mengandung janji, metode ini akan kembali
janji yang diselesaikan secara tidak sinkron atau yang sudah diselesaikan dijanjikan tergantung pada lingkungan.
Itu menyelesaikan Dan menolak metode
Kedua metode ini jelas.
Itu menyelesaikan
metode mengambil argumen yang merupakan nilai yang akan diselesaikan dengan janji.
Itu mengembalikan janji yang diselesaikan dengan nilai itu. Itu menolak
Metode, juga, mengambil argumen yang menjadi alasannya
janji harus ditolak, dan mengembalikan janji yang ditolak dengan alasan yang diberikan. Misalnya:
// menyelesaikan janji janji.tekad ('nilai terselesaikan'); // Tolak janji janji.tolak ('alasan untuk menolak');
Kesimpulan
Dalam tutorial ini kami belajar untuk mengetahui dan menggunakan janji dalam JavaScript. Kami melihat bagaimana kami dapat membangun janji kami sendiri, metode apa yang terkait
dengan janji, dan bagaimana kita bisa menggunakannya untuk mengelola kode asinkron, sebagai alternatif yang lebih bersih untuk panggilan balik. Sumber yang valid untuk meningkat lebih lanjut
Pengetahuan Anda tentang Janji Itu yang disediakan oleh Mozilla.
Dalam tutorial JavaScript berikutnya kita akan belajar cara menggunakan fungsi panah
. Nantikan LinuxConfig.org!
Tutorial Linux Terkait:
- Cara Membangun Aplikasi Tkinter Menggunakan Objek Berorientasi…
- Tutorial debugging GDB untuk pemula
- Bagaimana bekerja dengan WooCommerce Rest API dengan Python
- Ekspresi reguler Python dengan contoh
- Lanjutan regex bash canggih dengan contoh
- Menguasai loop skrip bash
- Loop bersarang dalam skrip bash
- Cara Mengatur Server OpenVPN di Ubuntu 20.04
- Instal Arch Linux di VMware Workstation
- Loop bash dengan contoh