Mari kembali ke masalah yang disebutkan di dalam bab Pengenalan: callback: kita memiliki sebuah urutan tugas asynchronous untuk dilakukan satu demi satu. Sebagai contoh, memuat scripts. Bagaimana kita bisa membuat kodenya dengan baik? Promises menyediakan beberapa resep untuk melakukannya. Di bab ini kita melibatkan promise chaining. Itu terlihat seperti ini:
Idenya adalah bahwa result diteruskan melalui rantai handlers 3.Ini alurnya:
Selama result diteruskan di sepanjang rantai handlers, kita bisa melihat urutan pemanggilan 9: 0 → 1 → 2.Seluruhnya bekerja, karena pemanggilan ke 3 mengembalikan sebuah promise, jadi kita bisa memanggil 3 selanjutnya.Ketika sebuah handler mengembalikan nilai, handler tersebut menjadi hasil dari promise, jadi 3 selanjutnya dipanggil dengan itu.Kesalahan klasik pemula: secara teknis kita juga dapat menambahkan banyak 3 ke satu promise. Ini bukan chaining.Sebagai contoh:
Apa yang kita lakukan di sini hanya beberapa handlers untuk satu promise. Handlers tersebut tidak meneruskan result ke satu sama lain, melainkan memprosesnya masing-masing. Ini gambarnya (bandingkan dengan chaining di atas): Semua 3 pada promise yang sama mendapatkan result yang sama – result dari promise. Jadi di dalam kode di atas semua 9 menunjukkan yang sama: 0.Dalam prakteknya kita jarang membutuhkan banyak handlers untuk satu promise. Chaining lebih sering digunakan. Sebuah handler, yang digunakan di dalam 0 dapat membuat dan mengambalikan sebuah promise.Dalam hal ini handlers selanjutnya menunggu sampai mengendap, dan kemudian mendapatkan hasilnya. Sebagai contoh:
Di sini 3 pertama menunjukan 0 dan mengembalikan 3 pada baris 4. Setelah satu detik selesai, dan hasil (argument 5, di sini 6) diteruskan ke handler 3 kedua. Handler pada baris 6, menunjukan 1 dan melakukan hal yang sama.Jadi keluarannya sama dengan contoh sebelumnya: 1 → 2 → 4, tetapi sekarang dengan menunda 1 detik antara pemanggilan 9.Mengembalikan promises memperbolehkan kita untuk membangun rantai aksi asynchronous. Mari menggunakan fitur ini dengan promisified 1, didefinisikan di , untuk memuat scripts satu demi satu, secara berurutan:
Kode ini bisa lebih ringkas dengan arrow functions:
Di sini setiap pemanggilan 1 mengembalikkan sebuah promise, dan 3 selanjutnya berjalan ketika promise selesai. Kemudian memulai pemuatan script selanjutnya. Jadi scripts dimuat satu setelah yang lain.Kita dapat menambahkan lagi aksi asynchronous ke rantainya. Harap catat bahwa kodenya masih “flat”, kodenya tumbuh ke bawah bukan ke kanan. Tidak ada tanda-tanda “pyramid of doom”. Secara teknis, kita dapat menambahkan 3 secara langsung ke setiap 1, seperti ini:
Kode ini melakukan hal yang sama: muat 3 scripts berurutan. Tetapi “tumbuh ke kanan”. Jadi kita punya masalah yang sama dengan callbacks. Orang yang baru memulai untuk menggunakan promises kadang-kadang tidak tahu tentang chaining, jadi mereka menulisnya dengan cara ini. Umumnya, chaining lebih disukai. Terkadang ok untuk menulis 3 secara langsung, karena function bersarang memiliki akses ke luar scope. Pada contoh di atas callback paling bertingkat memiliki akses ke semua variabel 7, 8, 9. Tetapi itu pengecualian bukan aturan.Thenables Tepatnya, sebuah handler mungkin tidak mengembalikkan sebuah promise, tetapi dipanggil objek “thenable” – sebuah objek sewenang-wenang yang memiliki method 3, dan diperlakukan sama seperti sebuah promise.Idenya adalah bahwa pustaka 3rd-party dapat menerapkan objek “promise-compatible” mereka sendiri. Mereka dapat memiliki serangkaian methods yang luas, tetapi juga kompatibel dengan promises asli, karena mereka menerapkan 3.Ini contoh dari objek thenable:
JavaScript memeriksa objek yang dikembalikkan oleh handler 3 di baris 4: jika ada method callable yang bernama 4, kemudian method tersebut memanggil method yang menyediakan functions 5, 6 asli sebagai arguments (mirip ke eksekutor) dan menunggu sampai satu dari mereka dipanggil. Pada contoh di atas 7 dipanggil setelah 1 detik 6. Kemudian result diteruskan ke bawah chain.Fitur ini memperbolehkan kita untuk untuk mengintegrasikan objek kustom dengan promise chains tanpa memiliki pewarisan dari 9.Di dalam pemrograman frontend promises sering digunakan untuk permintaan jaringan. Jadi mari lihat contoh yang lebih luas dari itu. Kita akan menggunakan methos fetch untuk memuat informasi tentang pengguna dari server jarak jauh. Banyak sekali pilihan parameter yang dilibatkan di dalam bab terpisah, tetapi sintaksis dasar cukup sederhana:
Ini membuat permintaan jaringan ke 0 dan mengembalikkan sebuah promise. Promise selesai dengan objek 1 ketika server jarak jauh merespon dengan header, tetapi sebelum response penuh diunduh.Untuk membaca response penuh, kita harus memanggil sebuah method 2: method tersebut mengembalikkan sebuah promise yang selesai ketika teks penuh ull telah diunduh dari server jarak jauh, dengan teks tersebut sebagai hasilnya.Kode di bawah ini membuat permintaan ke 3 dan memuat teks dari server:
Di sana juga ada method 4 yang membaca data remote dan parsing sebagai JSON. Pada kasus kita lebih sesuai, jadi mari ganti dengan itu..then(function(text) { // …and here’s the content of the remote file alert(text); // {“name”: “iliakan”, “isAdmin”: true} });
Sekarang mari lakukan sesuatu dengan memuat pengguna. Sebagai contoh, kita dapat membuat satu atau lebih permintaan ke GitHub, muat profil pengguna dan tunjukkan avatarnya: 0Kodenya bekerja, lihat komentar tentang detail. Meskipun, di sana ada potensi masalah di dalamnya, kesalahan umum dari mereka yang mulai menggunakan promise. Lihat pada baris 4: bagaimana kita dapat melakukan sesuatu setelah avatar telah muncul dan dihapus? sebagai contoh, kita ingin menunjukkan form untuk mengubah pengguna atau sesuatu yang lain. Sampai sekarang, tidak mungkin.Untuk membuat chain bisa diperpanjang, kita butuh untuk mengembalikkan sebuah promise yang selesai ketika avatar selesai muncul. Seperti ini: 1Itu adalah, handler 3 pada baris 4 sekarang mengembalikkan 8, yang menjadi mengendap hanya setelah pemanggilan 9 dalam 0 6. 3 selanjutnya di dalam chain akan menunggu untuk itu.Seperti peraturan yang bagus, sebuah aksi asynchronous harus selalu mengembalikkan sebuah promise. Itu membuat kemungkinan untuk rencana aksi setelahnya. Bahkan jika kita tidak berencana memperpanjang chain sekarang, kita mungkin membutuhkannya nanti. Akhinya, kita dapat memecah kodenya ke dalam function yang dapat digunakan kembali: 2Jika ada handler 3 (atau 4, tidak masalah) mengembalikkan sebuah promise, chain sisanya akan menunggu sampai mengendap. Saat itu terjadi, hasilnya (atau error) diteruskan lebih jauh.
Javascript Apa Itu Promise?Promise merupakan salah satu fitur yang penting dari ES6. Objek promise mewakili penyelesaian atau sebuah kesalahan pada operasi Asynchronous. Pada artikel sebelumnya kita telah belajar tentang Asynchnous pada javascript, tak lengkap rasanya apabila kita belum paham tentang Promise.
Kapan kita menggunakan asynchronous?Proses asynchronous sering digunakan untuk komunikasi data, karena data menjadi bagian inti dari sebuah aplikasi maka konsep asynchronous sangat penting untuk dipahami.
Apa itu async Await Javascript?Async/await adalah fitur yang hadir sejak ES2017. Fitur ini mempermudah kita dalam menangani proses asynchronous.Async/Await merupakan sebuah syntax khusus yang digunakan untuk menangani Promise agar penulisan code lebih efisien dan rapih.
|