Hai
Saya pikir di sini untuk memberi tahu Anda tentang bagaimana dalam JavaScript menggunakan perpustakaan Fluture Anda dapat membuat dan menggunakan fungsi-fungsi malas. Ini akan menjadi gambaran singkat tentang cara membuat fungsi, cara menangani kesalahan, dan sedikit tentang concurrency. Otak pemrograman fungsional saya tidak akan melambung! Aku janji!
Fluture
Fluture adalah perpustakaan yang dikembangkan oleh pengembang Aldwin Vlasblom yang mengimplementasikan Future. Future adalah alternatif dari Promise, yang memiliki API jauh lebih kuat yang memungkinkan implementasi pembatalan, eksekusi "rekursi" yang aman, "bebas kesalahan" (menggunakan Either) dan sejumlah kecil fitur keren.
Saya pikir ada baiknya memberitahu Anda tentang metode (monad) yang akan saya gunakan dalam contoh di bawah ini.
.of(Any)
- menciptakan Masa Depan dari nilai yang diteruskan.map(Function)
- tidak, ini bukan Array.map
, ini adalah fungsi transformasi yang mirip dengan Promise.then
.chainRej(Function)
- seperti Promise.catch
menangkap kesalahan.fork(Function, Function)
- memulai eksekusi di masa depan
Membuat fungsi malas
Bagi saya sendiri, saya menyoroti dua pendekatan utama untuk membuat fungsi malas di Fluture. Pendekatan pertama adalah kita membuat fungsi yang menerima sumber data dan mengembalikan Masa Depan yang siap untuk dieksekusi. Pendekatan kedua adalah bahwa kita menciptakan Masa Depan dengan semua transformasi yang dijelaskan, dan kemudian meneruskan data ke sana.
Tidak jelas Mari kita ambil contoh! Kami memiliki fungsi seperti itu
const multiply10 = x => x * 10;
Sekarang buat dia malas menggunakan pendekatan pertama
const multiply10 = x => x * 10; const lazyMultiply10 = (x) => Future .of(x)
Terlalu besar, bukan? Mari kita coba menulis dengan lebih ringkas menggunakan pendekatan kedua.
const multiply10 = x => x * 10; const lazyMultiply10 = Future.map(multiply10); const value = Future.of(2);
Sudah lebih baik, tetapi masih rumit. Itu harus lebih kompak!
const lazyMultiply10 = Future.map(x => x * 10); lazyMultiply10(Future.of(2)).fork(console.error, console.log);
Faktanya, pendekatan ini tidak saling eksklusif dan dapat digunakan bersama.
const lazyMultiply10 = Future.map(x => x * 10); const someCalculation = a => Future .of(a) .map(v => v + 1) .chain(v => lazyMultiply10(Future.of(v)); someCalculation(10).fork(console.error, console.log);
Menangani kesalahan
Penanganan kesalahan di Masa Depan praktis tidak berbeda dengan penanganan kesalahan dalam Janji. Ayo ingat bayangkan fungsi yang membuat permintaan ke pihak ketiga, tidak terlalu stabil, API.
const requestToUnstableAPI = query => request({ method: 'get', uri: `http://unstable-site.com/?${query}` }) .then(res => res.data.value) .catch(errorHandler);
Fungsi yang sama, tetapi dibungkus dalam Masa Depan
const lazyRequestToUnstableAPI = query => Future .tryP(() => request({ method: 'get', uri: `http://unstable-site.com/?${query}` })) .map(v => v.data.value) .chainRej(err => Future.of(errorHandler(err));
Bahkan, penanganan kesalahan bisa dibuat lebih fleksibel. Untuk melakukan ini, kita memerlukan struktur Either, dan kekecilan ini berada di luar cakupan ulasan saya.
Konkurensi
Untuk bekerja dengan paralelisme, Future mengimplementasikan dua metode race(Futures[])
(mirip dengan Promise.race
), parallel(n, Futures[])
dan both(Future, Future)
, tetapi ini adalah kasus khusus parallel
.
Metode parallel
mengambil dua argumen, jumlah Future paralel dan array dengan Future. Untuk membuat perilaku parallel
sama dengan metode Promise.all
, Anda perlu mengatur jumlah Promise.all
untuk ditetapkan sebagai Infinity
.
Di sini juga, kami tidak dapat melakukannya tanpa contoh.
const requestF = o => Future.tryP(() => request(o)); const parallel1 = Future.parallel(1); const lazyReqs = parallel1( [ 'http://site.com', 'http://another-site.com', 'http://one-more-site.com', ] .map(requestF) ); lazyReqs.fork(console.error, console.log);
Kompatibel dengan Janji
Tidak ada tempat untuk Janji dalam JavaScript, dan tidak mungkin ada orang yang senang jika metode Anda mengembalikan Masa Depan yang tidak jelas. Untuk melakukan ini, Future memiliki metode .promise()
, yang akan memulai eksekusi Future dan membungkusnya dalam Janji.
Future .of(10) .promise();
Referensi
Mungkin itulah yang ingin saya sampaikan kepada Anda. Jika topiknya menarik, beri tahu saya, saya akan memberi tahu Anda lebih banyak tentang penanganan kesalahan. Dan ya, jangan banyak memarahi saya, ini adalah posting pertama saya di Habré.