Laman » Pengekodan » Bermula dengan Janji JavaScript

    Bermula dengan Janji JavaScript

    Kod tak segerak berguna untuk melaksanakan tugas yang ada mengambil masa tetapi, tentu saja, itu tidak bersalah. Penggunaan kod Async fungsi panggil balik untuk memproses keputusannya, namun fungsi panggil balik tidak dapat mengembalikan nilai bahawa fungsi JavaScript biasa boleh.

    Oleh itu, mereka bukan sahaja mengambil keupayaan kita untuk mengawalnya pelaksanaan fungsi tersebut tetapi juga membuat pengendalian ralat sedikit kerumitan. Ini adalah di mana Janji objek datang dalam, kerana ia bertujuan untuk mengisi sebahagian daripada berlubang dalam kod tak segerak.

    Janji secara teknikal a objek dalaman piawai dalam JavaScript, bermakna ia datang terbina dalam untuk JavaScript. Ia digunakan untuk mewakili hasil akhirnya blok kod asynchronous (atau sebab mengapa kod gagal) dan mempunyai kaedah untuk mengawalnya pelaksanaan kod asynchronous.

    Sintaks

    Kita boleh buat contohnya Janji objek menggunakan baru kata kunci:

     Janji baru (fungsi (menyelesaikan, menolak) ); 

    Fungsinya diluluskan sebagai parameter kepada Janji () pembina dikenali sebagai pelaksana. Ia memegang kod asynchronous dan mempunyai dua parameter iaitu Fungsi jenis, dirujuk sebagai selesaikan dan menolak fungsi (lebih banyak lagi pada masa ini).

    Negeri Janji objek

    The keadaan awal a Janji objek dipanggil yang belum selesai. Dalam keadaan ini, keputusan pengiraan tidak segerak tidak wujud.

    Perubahan tertunda awal berubah kepada dipenuhi nyatakan apabila pengiraan adalah berjaya. The hasil perhitungan boleh didapati di negeri ini.

    Sekiranya pengiraan tak segerak gagal, yang Janji objek bergerak ke ditolak nyatakan dari awalnya yang belum selesai negeri. Dalam keadaan ini, sebab kegagalan pengiraan (mis. mesej ralat) disediakan.

    Untuk pergi dari sini yang belum selesai kepada dipenuhi negeri, menyelesaikan () dipanggil. Untuk pergi dari sini yang belum selesai kepada ditolak negeri, menolak () dipanggil.

    The kemudian dan tangkapan kaedah

    Apabila negeri itu perubahan dari yang belum selesai kepada dipenuhi, penganjur acara Janji objek kemudian kaedah dilaksanakan. Dan, apabila negeri itu perubahan dari yang belum selesai kepada ditolak, penganjur acara Janji objek tangkapan kaedah dilaksanakan.

    Contoh 1

    “Tidak Dijanjikan” kod

    Anggapkan ada a hello.txt fail yang mengandungi “Hello” perkataan. Inilah caranya kita boleh menulis permintaan AJAX ambil fail itu dan tunjukkan kandungannya, tanpa menggunakan Janji objek:

     fungsi getTxt () let xhr = XMLHttpRequest baru (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('teks / kosong'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (this.response); pecah; kes 404: buang 'Fail Not Found'; lalai: buang 'Gagal mengambil fail';  catch (err) console.log (err);  getTxt (); 

    Jika kandungan fail tersebut telah berjaya diambil, i.e. kod status tindak balas adalah 200, teks tindak balas adalah yang ditulis dalam dokumen itu. Jika fail itu tidak dijumpai (status 404), a “Fail tidak dijumpai” mesej ralat dibuang. Jika tidak, a mesej ralat umum menunjukkan kegagalan mengambil fail dibuang.

    “Promosi” kod

    Sekarang, mari Promarkan kod di atas:

     fungsi getTxt () return new Promise (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: resolve (this.response); case 404: reject ('Fail Not Found' mengambil fail ');;);  getTxt (), kemudian (function (txt) document.write (txt);). catch (function (err) console.log (err);); 

    The getTxt () fungsi kini dikodkan kembali contoh baru dari Janji objek, dan fungsi pelaksananya memegang kod asynchronous dari sebelumnya.

    Apabila kod status tindak balas adalah 200, yang Janji adalah dipenuhi oleh memanggil menyelesaikan () (sambutan diluluskan sebagai parameter menyelesaikan ()). Apabila kod status adalah 404 atau yang lain, yang Janji adalah ditolak menggunakan menolak () (dengan mesej ralat yang sesuai sebagai parameter menolak ()).

    The pengendali acara untuk kemudian () dan tangkapan () kaedah daripada Janji objek adalah ditambah pada akhir.

    Apabila Janji adalah dipenuhi, penganjur kemudian () kaedah dijalankan. Hujahnya adalah parameter yang diluluskan dari menyelesaikan (). Di dalam pengendali acara, teks tindak balas (diterima sebagai hujah) adalah yang ditulis dalam dokumen itu.

    Apabila Janji adalah ditolak, penganjur acara tangkapan () kaedah dijalankan, pembalakan kesilapan.

    The kelebihan utama versi Kod Promisifikasi di atas adalah pengendalian ralat. Daripada membuang Pengecualian Uncaught sekitar - seperti dalam versi Non-Promised - yang mesej kegagalan yang sesuai dikembalikan dan dilog masuk.

    Tetapi, itu bukan sekadar kembali daripada mesej kegagalan tetapi juga hasil pengiraan tak segerak yang boleh memberi manfaat kepada kita. Untuk melihatnya, kami perlu mengembangkan contoh kami.

    Contoh 2

    “Tidak Dijanjikan” kod

    Daripada hanya memaparkan teks dari hello.txt, saya mahu menggabungkannya dengan “Dunia” perkataan dan memaparkannya pada skrin selepas masa 2 saat. Inilah kod yang saya gunakan:

     fungsi getTxt () let xhr = XMLHttpRequest baru (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('teks / kosong'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (concatTxt (this.response)); pecah; kes 404: buang 'Fail Not Found'; lalai: buang 'Gagal mengambil fail';  catch (err) console.log (err);  fungsi concatTxt (res) setTimeout (function () return (res + 'World'), 2000);  getTxt (); 

    Pada kod status 200, yang concatTxt () fungsi dipanggil untuk menggabungkan teks tindak balas dengan “Dunia” perkataan sebelum menulisnya ke dalam dokumen.

    Tetapi, kod ini tidak akan berfungsi seperti yang dikehendaki. The setTimeout () fungsi panggil balik tidak boleh mengembalikan rentetan yang disambungkan. Apa yang akan dicetak pada dokumen itu ialah undefined kerana itu apa concatTxt () pulangan.

    “Promosi” kod

    Jadi, untuk membuat kod kerja, mari Promarkan kod di atas, termasuk concatTxt ():

     fungsi getTxt () return new Promise (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: resolve (this.response); case 404: reject ('Fail Not Found' mengambil fail ');;);  fungsi concatTxt (txt) kembali Janji baru (fungsi (menyelesaikan, menolak) setTimeout (function () resolve (txt + 'World');, 2000););  getTxt (), kemudian (txt) => return concatTxt (txt);). kemudian (txt) => document.write (txt); log (sesat);); 

    Seperti getTxt (), yang concatTxt () fungsi juga pulangan yang baru Janji objek bukannya teks bersambung. The Janji dikembalikan oleh concatTxt () adalah diselesaikan di dalam fungsi panggil balik balik setTimeout ().

    Berhampiran akhir kod di atas, pengendali peristiwa yang pertama kemudian () kaedah berjalan apabila Janji daripada getTxt () adalah dipenuhi, iaitu ketika fail itu diambil berjaya. Di dalam pengendali itu, concatTxt () dipanggil dan juga Janji dikembalikan oleh concatTxt () dikembalikan.

    Pengendali peristiwa kedua kemudian () kaedah berjalan apabila Janji dikembalikan oleh concatTxt () adalah dipenuhi, iaitu dua saat tamat masa selesai dan menyelesaikan () dipanggil dengan rentetan yang disatukan sebagai parameternya.

    Akhirnya, tangkapan () menangkap semua pengecualian dan mesej kegagalan dari kedua Janji.

    Dalam versi Promosi ini, “Hai dunia” rentetan akan berjaya dicetak kepada dokumen itu.