Memulai dengan Janji JavaScript
Kode asinkron berguna untuk melakukan tugas yang sedang membuang-buang waktu tapi tentu saja tidak tanpa kontra. Penggunaan kode Async fungsi panggilan balik untuk memproses hasilnya, namun fungsi panggilan balik tidak dapat mengembalikan nilai bahwa fungsi JavaScript khas bisa.
Dengan demikian, mereka tidak hanya menghilangkan kemampuan kita untuk mengendalikan pelaksanaan fungsi tetapi juga membuat penanganan kesalahan sedikit merepotkan. Di sinilah tempat Janji
obyek masuk, karena bertujuan untuk mengisi beberapa lubang dalam pengkodean asinkron.
Janji
secara teknis a objek internal standar dalam JavaScript, artinya itu datang bawaan untuk JavaScript. Digunakan untuk mewakili hasil akhirnya dari blok kode asinkron (atau alasan mengapa kode gagal) dan memiliki metode untuk mengontrol eksekusi kode asinkron.
Sintaksis
Kita bisa menciptakan contoh dari Janji
obyek menggunakan baru
kata kunci:
Janji baru (fungsi (menyelesaikan, menolak) );
Fungsinya dilewatkan sebagai parameter ke Janji()
konstruktor dikenal sebagai pelaksana. Itu memegang kode asinkron dan memiliki dua parameter Fungsi
mengetik, disebut sebagai menyelesaikan
dan menolak
fungsi (lebih lanjut tentang ini sebentar lagi).
Negara bagian Janji
obyek
Itu keadaan awal dari a Janji
objek disebut tertunda. Dalam keadaan ini, hasil perhitungan asinkron tidak ada.
Status pending awal berubah menjadi terpenuhi nyatakan kapan perhitungannya berhasil. Itu hasil perhitungan tersedia di negara ini.
Dalam hal perhitungan asinkron gagal, itu Janji
objek bergerak ke ditolak nyatakan dari awal tertunda negara. Dalam kondisi ini, alasan kegagalan perhitungan (mis. pesan kesalahan) tersedia.
Untuk pergi dari tertunda untuk terpenuhi negara, menyelesaikan()
disebut. Untuk pergi dari tertunda untuk ditolak negara, menolak()
disebut.
Itu kemudian
dan menangkap
metode
Ketika negara perubahan dari tertunda untuk terpenuhi, pengendali acara Janji
objek kemudian
metode dieksekusi. Dan, ketika negara perubahan dari tertunda untuk ditolak, pengendali acara Janji
objek menangkap
metode dieksekusi.
Contoh 1
“Tidak Dijanjikan” kode
Asumsikan ada hello.txt
file yang mengandung “Halo” kata. Begini cara kami dapat menulis permintaan AJAX ambil file itu dan perlihatkan isinya, tanpa menggunakan Janji
obyek:
function getTxt () let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () coba switch (this.status) case 200: document.write (this.response); istirahat; kasus 404: lempar 'File Tidak Ditemukan'; default: melempar 'Gagal mengambil file'; catch (err) console.log (err); getTxt ();
Jika konten file sudah berhasil diambil, yaitu. kode status respons adalah 200, teks responsnya adalah ditulis ke dalam dokumen. Jika file tersebut tidak ditemukan (status 404), Sebuah “Berkas tidak ditemukan” pesan kesalahan dilemparkan. Kalau tidak, a pesan kesalahan umum menunjukkan kegagalan mengambil file yang dilemparkan.
“Dijanjikan” kode
Sekarang, ayo Promisikan kode di atas:
function getTxt () mengembalikan Promise baru (fungsi (menyelesaikan, menolak) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) case 200: diselesaikan (this.response); case 404: reject ('File Not Found'); default: reject ('Gagal to ambil file ');;); getTxt (). lalu (fungsi (txt) document.write (txt);). catch (fungsi (err) console.log (err););
Itu getTxt ()
fungsi sekarang dikodekan ke mengembalikan contoh baru dari Janji
obyek, dan fungsi pelaksananya menyimpan kode asinkron dari sebelumnya.
Ketika kode status respons adalah 200, itu Janji
aku s terpenuhi oleh panggilan menyelesaikan()
(tanggapan dilewatkan sebagai parameter menyelesaikan()
). Ketika kode status 404 atau yang lain, kode Janji
aku s ditolak menggunakan menolak()
(dengan pesan kesalahan yang sesuai sebagai parameter menolak()
).
Itu penangan acara untuk kemudian()
dan menangkap()
metode dari Janji
objek adalah ditambahkan di akhir.
Ketika Janji
aku s terpenuhi, pawang kemudian()
Metode dijalankan. Argumennya adalah parameter lulus dari menyelesaikan()
. Di dalam event handler, teks respons (diterima sebagai argumen) adalah ditulis ke dalam dokumen.
Ketika Janji
aku s ditolak, pengendali acara menangkap()
Metode dijalankan, mencatat kesalahan.
Itu keuntungan utama dari kode yang Dijanjikan di atas adalah penanganan kesalahan. Alih-alih melemparkan Pengecualian Tidak Berhasil - seperti dalam versi Non-Dijanjikan - pesan kegagalan yang sesuai dikembalikan dan dicatat.
Tapi, bukan hanya itu saja kembali dari pesan kegagalan tetapi juga dari hasil perhitungan asynchronous itu bisa benar-benar menguntungkan bagi kita. Untuk melihat itu, kita perlu memperluas contoh kita.
Contoh 2
“Tidak Dijanjikan” kode
Alih-alih hanya menampilkan teks dari hello.txt
, aku ingin menggabungkannya dengan “Dunia” kata dan menampilkannya di layar setelah batas waktu 2 detik. Berikut kode yang saya gunakan:
function getTxt () let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () coba switch (this.status) case 200: document.write (concatTxt (this.response))); istirahat; kasus 404: lempar 'File Tidak Ditemukan'; default: melempar 'Gagal mengambil file'; catch (err) console.log (err); function concatTxt (res) setTimeout (function () return (res + 'World'), 2000); getTxt ();
Pada kode status 200, the concatTxt ()
fungsi dipanggil ke menyatukan teks respons dengan “Dunia” kata sebelum menuliskannya ke dalam dokumen.
Tapi, kode ini tidak akan berfungsi seperti yang diinginkan. Itu setTimeout ()
fungsi panggilan balik tidak dapat mengembalikan string bersambung. Apa yang akan dicetak ke dokumen adalah tidak terdefinisi
karena itu apa concatTxt ()
kembali.
“Dijanjikan” kode
Jadi, agar kode berfungsi, mari Promisikan kode di atas, termasuk concatTxt ()
:
function getTxt () mengembalikan Promise baru (fungsi (menyelesaikan, menolak) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) case 200: diselesaikan (this.response); case 404: reject ('File Not Found'); default: reject ('Gagal to ambil file ');;); function concatTxt (txt) return New Promise (fungsi (resolusikan, tolak) setTimeout (function () resol (txt + 'World');, 2000);); getTxt (). then ((txt) => return concatTxt (txt);). then ((txt) => document.write (txt);). catch ((err) => console. log (err););
Seperti getTxt ()
, itu concatTxt ()
berfungsi juga mengembalikan yang baru Janji
obyek alih-alih teks gabungan. Itu Janji
dikembalikan oleh concatTxt ()
aku s diselesaikan di dalam fungsi panggilan balik dari setTimeout ()
.
Mendekati akhir kode di atas, pengendali acara yang pertama kemudian()
Metode berjalan ketika Janji
dari getTxt ()
aku s terpenuhi, yaitu ketika file tersebut berhasil diambil. Di dalam pawang itu, concatTxt ()
disebut dan Janji
dikembalikan oleh concatTxt ()
dikembalikan.
Penangan acara yang kedua kemudian()
Metode berjalan ketika Janji
dikembalikan oleh concatTxt ()
aku s terpenuhi, yaitu dua detik waktu habis sudah berakhir dan menyelesaikan()
disebut dengan string bersambung sebagai parameternya.
Akhirnya, menangkap()
menangkap semua pengecualian dan pesan kegagalan dari kedua Janji.
Dalam versi yang Dijanjikan ini, the “Halo Dunia” string akan berhasil dicetak ke dokumen.