Peringatan
Jangan menginstal paket ini sebagai ketergantungan! (Lihat: Memulai)
Saat ini, janji-janji adalah cara de-facto untuk menangani tugas-tugas asinkron dalam JavaScript, dan karena itu, mereka adalah bagian mendasar dari pengetahuan pengembang JavaScript.
Namun, ketika kita belajar janji untuk pertama kalinya, kita hanya belajar cukup untuk bertahan , yaitu, kita belajar sedikit tentang cara menggunakan janji, (saat ini, kemungkinan besar hanya dengan async/await ), metode Promise.all . Semua dan hanya itu.
Sementara pendekatan ini masuk akal bagi pemula karena cukup untuk menyelesaikan sebagian besar masalah dalam kehidupan sehari -hari mereka, masalah yang berulang adalah bahwa mereka berhenti di situ , yaitu, mereka tidak pernah melewati pengetahuan awal ini.
Dan justru ini "belajar cukup untuk mendapatkan" postur yang menahan banyak pengembang di tingkat mereka saat ini, karena memecahkan masalah yang lebih kompleks membutuhkan pemahaman yang lebih dalam.
Jadi, jika Anda ingin membawa keterampilan pengembang Anda ke tingkat berikutnya , berenang di perairan yang dangkal tidak akan memotongnya , Anda harus masuk lebih dalam , Anda perlu memahami sepenuhnya janji, dan bagaimana mereka bekerja, Anda harus menjadi mahir dalam gaya async/await yang then/catch efektif, dan dapat mengatur cara yang paling efektif dengan cara yang mungkin.
Juga, karena janji pada akhirnya merupakan abstraksi untuk menangani tugas asinkron, mampu mengatasi masalah umum yang terkait dengan pemrograman asinkron adalah suatu keharusan.
Dengan mengingat hal itu, kami menciptakan proyek ini dengan tepat untuk membantu Anda melakukan penyelaman mendalam ini ke janji -janji dan pemrograman asinkron.
Dengan memberikan penjelasan dan latihan praktis seputar topik -topik ini, proyek ini bertujuan untuk menjadi teman Anda dalam perjalanan ini untuk menguasai mereka.
Bahkan jika Anda sudah menjadi pengembang berpengalaman, Anda mungkin belajar satu atau dua hal, seperti, misalnya, Anda mungkin ingin mencoba memecahkan concrete/parallelMaxConcurrency , concrete/concurrencyOverride , concrete/extractingResolvers dan /foundation/promise saat mereka menghadirkan beberapa tantangan yang menarik.
Penting
Proyek ini tidak ditujukan untuk orang -orang yang belajar janji untuk pertama kalinya, karena ia mengasumsikan bahwa Anda memiliki setidaknya beberapa pengetahuan dasar tentang janji, apa yang mereka wakili dan bagaimana menggunakan keduanya dengan async/await dan then/catch .
Peringatan
Perhatian: Repo ini tidak dimaksudkan untuk dikloning kecuali Anda berkontribusi jika Anda adalah pengguna akhir, silakan ikuti instruksi di bawah ini
Pertama, untuk menginstal proyek, jalankan:
npm create promises-training@latestCatatan
Proyek ini didorong oleh olahraga, jadi tujuan utamanya adalah untuk menyelesaikannya.
Kadang -kadang, akan ada penjelasan bersama dengan latihan untuk membantu Anda memahami apa yang perlu dilakukan, dan juga beberapa konteks tentang masalah yang diselesaikan.
Latihan dibagi menjadi tiga kategori:
Penting
Tidak ada pesanan khusus untuk kategori, Anda dapat mulai dari salah satu dari mereka dan beralih ke yang lain bahkan sebelum menyelesaikan yang lain sepenuhnya. Namun, latihan memiliki tingkat berbeda yang akan dibahas selanjutnya.
Latihan terletak di dalam folder src/exercises/<category> , di mana <category> adalah salah satu kategori yang disebutkan di atas.
Untuk latihan grafik , penjelasan dasar terletak di readme ini, di bagian grafik, dan untuk setiap latihan, ada graph.png yang menggambarkan grafik ketergantungan untuk latihan spesifik tersebut.
Untuk latihan beton dan pondasi , penjelasannya terletak di README.md di dalam folder latihan (misalnya src/exercises/concrete/parallelChunks/README.md ).
Untuk menyelesaikan latihan, Anda perlu mengedit file src/exercises/<category>/<exercise>/exercise.ts .
Setelah menyelesaikan latihan, Anda dapat memeriksa solusi Anda dengan menjalankan:
npm run check < category > / < exercise > Tes terletak di dalam src/tests .
Secara umum, Anda hanya akan bekerja di dalam folder latihan karena tes dirancang sedemikian rupa sehingga mereka memberi tahu Anda apa yang salah tanpa harus melihat implementasinya, tetapi jika karena alasan apa pun Anda terjebak atau penasaran, Anda dapat mengintip mereka.
Folder src/lib dimaksudkan untuk penggunaan internal saja, jadi jangan repot -repot dengan itu.
Juga, untuk menjaga agar instalasi Anda tetap kompatibel dengan versi mendatang, jangan memodifikasi file apa pun di luar folder src/exercises .
Selain kategori, latihan juga dibagi menjadi level, di mana latihan meningkat dalam kesulitan saat Anda maju melalui level.
Ada tiga level:
Perlu diingat bahwa klasifikasi ini agak subyektif, jadi YMMV dan Anda juga tidak perlu menyelesaikan semua latihan di tingkat untuk pindah ke yang berikutnya.
Catatan
Seperti yang Anda lihat, saat ini, tidak ada banyak latihan lanjutan, tetapi idenya adalah bahwa latihan baru akan ditambahkan dari waktu ke waktu.
Setiap latihan disertai dengan tes otomatis sehingga Anda dapat memeriksa solusi Anda.
Untuk menjalankan tes latihan tunggal, jalankan:
npm run check < category > / < exercise > Misalnya, untuk menjalankan tes untuk latihan parallelChunks , jalankan:
npm run check concrete/parallelChunksAtau, untuk menjalankan latihan grafik nomor 2, jalankan:
npm run check graph/2/test.test.tsCatatan
Dalam contoh sebelumnya, kami perlu menambahkan /test.test.ts ke file latihan jika tidak, ia juga akan berjalan untuk latihan grafik lain yang dimulai dengan 2 , misalnya: Latihan dari 2 hingga 29.
Kami menggunakan Vitest sebagai pelari uji, jadi semua opsi CLI tersedia.
Juga, penting untuk menyebutkan bahwa latihan grafik memiliki beberapa kekhasan, dalam arti bahwa mereka dihasilkan secara otomatis dari grafik itu sendiri , dan karena itu, beberapa latihan memiliki sejumlah besar tes (beberapa latihan memiliki lebih dari 100 ribu tes).
Tentu saja, kami tidak menjalankan semuanya karena akan sangat lambat, jadi kami hanya menjalankan sebagian dari mereka dan dimungkinkan untuk mengubah jumlah tes yang dijalankan dan juga subset .
Anda dapat membaca lebih lanjut di bagian Latihan Grafik.
Saat ini, ada tiga kategori latihan:
Sebagian besar dari berurusan dengan tugas -tugas asinkron adalah mengatur mereka sehingga setiap tugas dimulai sesegera mungkin, dan untuk mengatur tugas -tugas ini dengan benar, kita perlu memahami hubungan ketergantungan di antara mereka.
Dalam kategori ini, Anda akan disajikan dengan grafik ketergantungan di setiap latihan dan kemudian Anda akan mengatur tugas dalam grafik dengan cara yang paling efisien.
Karena latihan ini difokuskan pada orkestrasi itu sendiri, tugas dibuat dengan memanggil createPromise(label) , di mana label adalah string yang mengidentifikasi tugas.
Ambil grafik ini, misalnya:

Ada dua tugas dalam grafik ini, A dan B , dan B tergantung pada A , yang diwakili oleh panah yang keluar dari B dan titik ke A .
Ini berarti bahwa B hanya dapat dimulai setelah A selesai dan A , karena tidak tergantung pada tugas lain, dapat segera dimulai.
Dengan demikian, implementasi yang paling efisien untuk grafik ini adalah:
await createPromise ( "A" ) ;
await createPromise ( "B" ) ;Tugas juga dapat bergantung pada lebih dari satu tugas:

Dalam grafik ini, C tergantung pada A dan B , sehingga hanya dapat dimulai setelah A dan B selesai.
Namun, baik A dan B tidak bergantung pada tugas lain, sehingga mereka dapat segera mulai.
Implementasi yang paling efisien untuk grafik ini adalah:
await Promise . all ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;Tugas juga dapat memiliki beberapa set dependensi yang berbeda di mana, jika salah satu set dipenuhi, maka tugas dapat dimulai:

Dalam grafik ini, C tergantung pada A atau pada B , yang diwakili dengan menggunakan warna yang berbeda untuk setiap set ketergantungan. Warna -warna itu sendiri tidak memiliki makna spesifik, mereka digunakan seperti ini hanya sehingga ketergantungannya dibedakan satu sama lain.
Oleh karena itu, C dapat dimulai segera setelah A atau B telah selesai.
await Promise . any ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;Terakhir, janji memiliki dua hasil yang mungkin: mereka dapat dipenuhi atau ditolak.

Dalam grafik ini, kami memiliki tugas B yang tergantung pada A dan tugas C yang tergantung pada penolakan A
Penting
Tepi putus -putus digunakan untuk mewakili penolakan janji.
Ini berarti bahwa B hanya dapat dimulai setelah A dipenuhi dan C hanya dapat dimulai setelah A ditolak.
Karena hanya satu dari hasil ini yang dimungkinkan, baik B atau C akan dilakukan.
Implementasi yang sesuai:
try {
await createPromise ( "A" ) ;
try {
await createPromise ( "B" ) ;
} catch { }
} catch {
await createPromise ( "C" ) ;
} Saat melakukan latihan grafik, Anda akan melihat bahwa tiga fungsi sedang diekspor: mixed , asyncAwait , thenCatch .
Idenya adalah bagi Anda untuk memberikan 3 implementasi yang berbeda:
mixed : Yang ini benar -benar gratis, Anda dapat mencampur baik async/menunggu dan kemudian/menangkap,asyncAwait : Dalam yang ini Anda hanya boleh menggunakan async/menungguthenCatch : Dalam hal ini Anda hanya harus menggunakan/menangkap.Dengan cara ini Anda akan mahir dalam kedua gaya penanganan janji.
Juga, di akhir file, Anda akan melihat bahwa ekspor sedang dibungkus dengan skipExercise , yang melewatkan tes untuk implementasi spesifik itu sehingga tidak mengotori output.
Saat Anda menerapkan solusi untuk masing -masing dari ketiganya, hapus panggilan skipExercise untuk implementasi yang Anda inginkan untuk dijalankan tes. Misalnya: Jika Anda sudah menerapkan solusi mixed , lepaskan skipExercise dari itu tetapi simpan yang untuk asyncAwait dan thenCatch sampai Anda mengimplementasikannya.
Untuk membantu Anda dalam men -debug implementasi Anda untuk latihan grafik, kami membuat UI yang memungkinkan Anda untuk mensimulasikan berbagai "jalur" eksekusi.
Untuk membuka UI, jalankan:
npm run graph:uiUI disajikan sebagai aplikasi web dan terlihat seperti ini.

Sekarang mari kita jelajahi setiap bagian:

Sidebar di sebelah kiri memungkinkan Anda untuk memilih latihan yang ingin Anda debug.

Bagian teratas ini memungkinkan Anda untuk memilih implementasi yang ingin Anda debug.

Sidebar kanan memungkinkan Anda mengontrol aliran eksekusi latihan dengan menyelesaikan/menolak janji.
Saat janji dibuat, entri baru ditambahkan ke bilah samping.

Bagian ini di pusat menunjukkan catatan janji -janji yang dibuat dan diselesaikan/ditolak pada setiap langkah.

Bagian ini di bagian bawah menunjukkan ringkasan janji -janji yang diselesaikan/ditolak pada setiap langkah, secara berurutan.
Karena latihan grafik didasarkan pada grafik (duh), dimungkinkan untuk menghasilkan semua tes yang mungkin untuk latihan yang diberikan secara otomatis, itulah yang kami lakukan.
Seperti yang mungkin dibayangkan, jumlah tes yang dihasilkan terkadang sangat besar, jadi kami memiliki tutup pada jumlah maksimum tes yang dijalankan.
Juga, untuk mencegah bias, kami tidak menjalankan tes dalam urutan yang dihasilkan, sebaliknya, kami mengocoknya .
Pengocok ini terjadi tepat setelah tes pertama kali dihasilkan, sehingga tes deterministik , yaitu, setiap kali Anda menjalankan tes latihan grafik, Anda akan menjalankan subset tes yang sama.
Namun, dimungkinkan untuk mengubah tutup dan subset tes yang dijalankan.
Untuk mengubah tutupnya, Anda dapat menjalankan npm run graph:setGraphTestsCap <number> .
Misalnya, untuk mengatur tutupnya ke 10000, jalankan:
npm run graph:setGraphTestsCap 10000 Untuk mengubah subset tes yang dijalankan, Anda dapat menjalankan npm run graph:shuffleGraphTestData <graph-exercise-number> , yang akan merancang ulang tes untuk latihan grafik yang ditentukan, yang kemudian akan menghasilkan subset tes yang berbeda.
Misalnya, untuk merombak pengujian untuk latihan grafik nomor 2, jalankan:
npm run graph:shuffleGraphTestData 2Latihan grafik sangat bagus untuk memahami hubungan ketergantungan antara tugas, namun, mereka tidak mencakup spektrum penuh dari skenario yang mungkin, karena hanya tugas -tugas yang ketergantungannya diketahui pada waktu kompilasi dan tetap dapat diwakili oleh grafik.
Oleh karena itu kami memiliki kategori latihan konkret ini, di mana Anda akan disajikan dengan skenario konkret yang harus Anda terapkan.
Karena setiap latihan dalam kategori ini unik, deskripsi mereka dikoleksi dengan folder mereka.
Latihan fondasi dirancang untuk membantu Anda memperkuat pemahaman Anda tentang fondasi janji, dengan mengimplementasikan kembali fungsi yang berhubungan dengan janji dan, pada akhirnya, janji itu sendiri.
Deskripsi dikoleksi dengan latihan.
Solusi untuk latihan dapat ditemukan dalam repo ini, mis.
Namun, kami sarankan Anda hanya memeriksa solusi setelah Anda menyelesaikan latihan sendiri, karena tujuannya adalah untuk Anda pelajari dengan menyelesaikan latihan.
Juga, perlu diingat bahwa saat ini solusi yang disajikan belum tentu yang terbaik , yang berarti bahwa bahkan jika solusi Anda tidak menyerupai yang akan Anda temukan di sini sama sekali, itu tidak berarti bahwa mereka buruk.
Untuk memudahkan peningkatan ke versi yang lebih baru, kami membuat skrip migrasi yang secara otomatis memigrasi instalasi Anda ke versi terbaru sambil melestarikan solusi Anda.
Untuk menjalankan skrip migrasi, jalankan:
npm create promises-training@latest -- --migrateProyek ini dilisensikan di bawah CC-by-NC-ND 4.0.
Tujuan di balik proyek ini adalah untuk menjadi sumber belajar gratis dan untuk tetap gratis dan dapat diakses selamanya.
Berikut adalah tanya jawab dari beberapa pertanyaan umum tentang lisensi:
Bisakah saya menggunakan proyek ini untuk studi diri atau kelompok?
Ya, tolong lakukan.
Bisakah saya menggunakan proyek ini dalam pelatihan internal perusahaan?
Ya, selama Anda memuji proyek dan menjelaskan bahwa proyek tersebut dapat diakses secara bebas secara independen dari pelatihan.
Dapatkah saya menggunakan proyek ini untuk sesi pendampingan/lokakarya berbayar saya?
Ya, selama Anda memuji proyek, jelaskan bahwa proyek ini dapat diakses secara bebas secara independen dari bimbingan/lokakarya, jelaskan bahwa Anda mengenakan biaya untuk waktu Anda dan bukan untuk proyek itu sendiri, jelaskan bahwa proyek ini bukan bagian dari materi Anda sendiri dan memperjelas bahwa kami tidak mendukung Anda atau layanan Anda.
Bisakah saya menggunakan proyek ini untuk kursus online berbayar saya?
Ya, selama Anda memuji proyek, jelaskan bahwa proyek ini dapat diakses secara bebas dari kursus online, jelaskan bahwa Anda mengenakan biaya untuk waktu Anda dan bukan untuk proyek itu sendiri, jelaskan bahwa proyek ini bukan bagian dari materi Anda sendiri dan memperjelas bahwa kami tidak mendukung Anda atau layanan Anda.
Dapatkah saya membuat garpu proyek ini dan menggunakannya untuk tujuan saya sendiri?
Tidak, Anda tidak bisa. Anda hanya dapat menggunakan proyek ini sebagaimana adanya, tanpa modifikasi apa pun. Ini diperlukan untuk mencegah orang membuat garpu dan kemudian menagih untuk mereka.
Bisakah saya membuat kursus online berdasarkan proyek ini?
Tidak, Anda tidak bisa, karena kami tidak ingin orang membuat "pembungkus" di sekitar proyek ini dan kemudian menagih untuk mereka.
Jika Anda memiliki pertanyaan tentang lisensi, atau ingin membicarakan kasus penggunaan tertentu, jangan ragu untuk menghubungi saya di [email protected].