Pemrograman asinkron di JavaScript secara bertahap telah diterima oleh semua orang. Sebelumnya, orang biasanya mengimplementasikannya melalui Callback Nesting, SetTimeout, SetInterval, dll. Kode ini terlihat sangat tidak intuitif, dan sulit untuk dipahami dengan cepat tanpa melihat seluruh logika kode. Fungsi asinkron dalam JavaScript termasuk fungsi I/O (AJAX, PostMessage, IMG Load, Script Load, dll.), Fungsi waktu (setTimeout, setInterval), dll.
Kita semua akrab dengan ini. Dalam aplikasi yang kompleks, sering ada beberapa lapisan bersarang, dan bahkan berpikir bahwa beberapa langkah belum selesai dan pengecualian program disebabkan. Contoh paling sederhana adalah: misalnya, jika Anda menyuntikkan simpul ke dalam DOM, Anda harus menunggu node disuntikkan dan mengoperasikan node. Ketika sejumlah besar node disuntikkan, seringkali sulit untuk memahami waktu. Jika kita memiliki kode untuk mengandalkan data API pihak ketiga. Kita tidak dapat mempelajari bagaimana latensi respons API, dan bagian lain dari aplikasi dapat diblokir sampai mengembalikan hasilnya. Janji memberikan solusi yang lebih baik untuk masalah ini, itu tidak memblokir dan sepenuhnya dipisahkan dari kode.
Jadi, izinkan saya melihat pemrograman asinkron di JavaScript. Pertama -tama, saya sarankan Anda untuk melihat spesifikasi janji/A yang relatif populer.
Janji/A Spesifikasi
Catatan: Untuk kemudahan pemahaman, deskripsi mungkin berbeda dari spesifikasi janji/A;
Janji CommonJS/A Spesifikasi Menyederhanakan Pemrograman Asinkron dengan Standarisasi Antarmuka API, Membuat Kode Logika Asynchronous kami lebih mudah dipahami.
Kami menyebut implementasi spesifikasi janji/A. Objek janji hanya memiliki tiga negara: tidak terpenuhi, dipenuhi, dan gagal; Awalnya dibuat dengan keadaan yang tidak terpenuhi, dan negara hanya dapat berubah dari yang tidak terpenuhi menjadi terpenuhi, atau tidak terpenuhi menjadi gagal (gagal/ditolak). Setelah negara terpenuhi (selesai) atau gagal (gagal/ditolak), negara tidak dapat berubah lagi.
Spesifikasi Janji/A memberikan solusi untuk menggambarkan konsep penundaan (atau masa depan) dalam suatu program. Gagasan utamanya adalah bukan untuk menjalankan metode dan kemudian memblokir aplikasi dan menunggu hasilnya kembali sebelum menelepon kembali metode lain, tetapi untuk mengembalikan objek janji untuk memuaskan mendengarkan di masa depan. Baik negara terpenuhi dan keadaan yang gagal dapat didengarkan. Promise register callbacks dengan menerapkan antarmuka kemudian untuk mengembalikan objek janji:
Salinan kode adalah sebagai berikut: kemudian (dipenuhi oleh Handler, ErrorHandler, ProgressHandler);
Kemudian antarmuka digunakan untuk mendengarkan berbagai keadaan janji. Penyelidikan yang dipenuhi digunakan untuk mendengarkan keadaan terpenuhi, Errorhandler digunakan untuk mendengarkan keadaan yang gagal, dan ProgressHandler digunakan untuk mendengarkan keadaan yang tidak terpenuhi. Janji tidak memaksa mendengarkan acara yang tidak terpenuhi (misalnya, kita tahu bahwa versi lama jQuery (1.5, 1.6) ditangguhkan adalah implementasi janji, tetapi tidak mengimplementasikan keadaan yang tidak terpenuhi mendengarkan bolak -balik.
Secara umum diyakini bahwa antarmuka saat itu mengembalikan objek janji baru, bukan objek janji asli. Objek janji baru baru ini dapat dipahami sebagai pandangan dari objek janji asli. Ini hanya berisi serangkaian metode objek janji asli. Metode -metode ini hanya dapat mengamati status objek janji asli, tetapi tidak dapat mengubah keadaan internal objek yang ditangguhkan. Ini dapat menghindari konflik antara beberapa penelepon, yang dapat mengubah keadaan objek janji baru tanpa mempengaruhi penelepon lain.
Selain itu, Promise menyediakan dua antarmuka yang mengimplementasikan transisi negara dari Resolve (status implementasi dari yang belum selesai hingga selesai) dan menolak (negara implementasi dari yang belum selesai untuk menolak atau gagal).
Kirim gambar untuk membantu memahami:
Dengan janji, Anda dapat menulis logika asinkron dengan pola pikir sinkron. Dalam fungsi asinkron, Anda tidak dapat menggunakan mencoba/menangkap untuk menangkap pengecualian, dan Anda tidak dapat melempar pengecualian. Dengan janji, kita dapat secara langsung mendefinisikan ERRORHANDLER, yang setara dengan menangkap pengecualian.
Berikut ini adalah beberapa pustaka kelas yang mengikuti spesifikasi janji/A, ketika, q, rsvp.js, jQuery.Deferred, dll.