Trong số các thư viện mã hóa hàm (functional coding library), fp-ts đã trở nên phổ biến nhờ tập trung vào ánh xạ hàm (functional mapping) và monad, nhưng giờ đây nó đã được tích hợp vào Effect và chuyển đổi thành một framework.
Khác với các thư viện trước đây, Effect hoạt động như một framework và việc sử dụng đối tượng Effect yêu cầu kiến thức liên quan.
Effect sử dụng các đối tượng được bọc trong Effect, tương tự như Observable trong RxJs, và được dự đoán sẽ thiết lập một tiêu chuẩn mới cho ngành công nghiệp Node.js.
Trong vài năm qua, lập trình hàm đã trở thành một xu hướng khá phổ biến.
Nếu lập trình hướng đối tượng tập trung vào việc tạo ra cấu trúc thì
lập trình hàm lại tập trung vào việc tạo ra sự ngắn gọn trong mã code chi tiết.
Tất nhiên, xu hướng lập trình hàm thường xuất hiện theo chu kỳ vài năm một lần.
Cùng với sự phổ biến của lập trình hàm, nhiều thư viện khác nhau bắt đầu xuất hiện.
Theo cảm nhận của tôi, FxTschỉ là một bộ công cụ sử dụng generator để tạo ra đánh giá lười biếng.
lodash cũng tương tự, mang cảm giác như một bộ công cụ.
Tất nhiên, những bộ công cụ này có hỗ trợ cho lập trình khai báo.
Tuy nhiên, lập trình hàm mà chúng ta đang tìm kiếm không phải là như vậy, mà là về ánh xạ, tương ứng, monad, và nhiều monad hơn nữa.
fp-ts là thư viện phù hợp với điều này, và người duy trì nó cũng rất tâm huyết với lập trình hàm.
Nhưng cách đây vài tháng, tôi đã nghe nói rằng thư viện nàyEffect đã được hợp nhất.
Vì vậy, tôi đã kiểm tra Effect và nhận thấy có điều gì đó khác biệt.
Nếu fp-ts trước đây giống như một thư viện thì Effect lần này lại giống như một framework hơn.
Để sử dụng Effect, bạn cần phải có kiến thức cơ bản về nó.
NestJs và NextJs cũng tương tự, bạn cần phải hiểu về chúng.
Thư viện thì chỉ cần API được phơi bày rõ ràng là có thể sử dụng được, nhưng framework thì bạn cần phải hiểu về gói đó.
import{Effect,Console}from"effect"let i =1const expensiveTask =Effect.promise(()=>{console.log("expensive task...")returnnewPromise((resolve)=>{setTimeout(()=>{resolve(result ${i++})},100)});})const program =Effect.gen(function*(){console.log("non-cached version:")yield* expensiveTask.pipe(Effect.andThen(Console.log))yield* expensiveTask.pipe(Effect.andThen(Console.log))console.log("cached version:")const cached =yield*Effect.cached(expensiveTask)yield* cached.pipe(Effect.andThen(Console.log))yield* cached.pipe(Effect.andThen(Console.log))})Effect.runFork(program)/*
Output:
non-cached version:
expensive task...
result 1
expensive task...
result 2
cached version:
expensive task...
result 3
result 3
*/
Về cơ bản, Effect thay vì sử dụng Observable như RxJs thì lại sử dụng Effect để bọc các đối tượng,
giống như async lan truyền khắp nơi.
Để sử dụng đối tượng Effect , các hàm sử dụng đối tượng đó cũng phải là Effect.
Giống như program trong đoạn code ở trên.
Tất nhiên, có một số hàm được sử dụng làm điểm nhập cảnh, nhưng nó không thực sự hấp dẫn lắm.
Dù sao đi nữa, hình thức và sự gọn gàng của Effect với vai trò là một framework sẽ mang đến một làn gió mới và một tiêu chuẩn mới cho ngành công nghiệp Node, tôi tin là vậy.