Tuyên bố miễn trừ trách nhiệm: Tôi là một trong những tác giả của redux - có thể quan sát được nên tôi khó có thể vô tư 100%.
Hiện tại chúng tôi không cung cấp bất kỳ lý do nào có thể quan sát được redux tốt hơn redux-saga bởi vì ... không phải vậy. 😆
tl; dr có những ưu và nhược điểm cho cả hai. Nhiều người sẽ tìm thấy một thứ trực quan hơn cái kia, nhưng cả hai đều phức tạp để học theo những cách khác nhau nếu bạn không biết RxJS (có thể quan sát được) hoặc trình tạo / "hiệu ứng như dữ liệu" (redux-saga).
Họ giải quyết cùng một vấn đề theo những cách cực kỳ giống nhau, nhưng có một số khác biệt cơ bản chỉ trở nên thực sự rõ ràng khi bạn sử dụng chúng đủ.
redux có thể quan sát được gần như tất cả mọi thứ đối với RxJS thành ngữ. Vì vậy, nếu bạn có kiến thức RxJS (hoặc có được nó), việc học và sử dụng redux có thể quan sát là siêu siêu tự nhiên. Điều đó cũng có nghĩa là kiến thức này có thể chuyển sang những thứ khác ngoài redux. Nếu bạn quyết định chuyển sang MobX, nếu bạn quyết định chuyển sang Angular2, nếu bạn quyết định chuyển sang một số độ hot X trong tương lai, rất có thể RxJS có thể giúp bạn. Điều này là do RxJS là một thư viện async chung, và theo nhiều cách, nó giống như một ngôn ngữ lập trình trong chính bản thân nó trong toàn bộ mô hình "Lập trình phản ứng". RxJS tồn tại từ năm 2012 và bắt đầu như một cổng của Rx.NET (có "cổng" trong gần như mọi ngôn ngữ chính, nó rất hữu ích ).
redux-saga cung cấp chính các toán tử dựa trên thời gian của nó, vì vậy trong khi kiến thức bạn có được về các trình tạo và xử lý các tác dụng phụ theo kiểu trình quản lý quy trình này có thể chuyển được, thì các toán tử và cách sử dụng thực tế không được sử dụng trong bất kỳ thư viện chính nào khác. Vì vậy, đó là một chút đáng tiếc, nhưng chắc chắn không nên là một người phá vỡ thỏa thuận.
Nó cũng sử dụng "hiệu ứng như dữ liệu" ( được mô tả ở đây ), có thể khó khăn trong việc quấn đầu của bạn, nhưng điều đó có nghĩa là mã redux-saga của bạn không thực sự tự thực hiện các tác dụng phụ. Thay vào đó, các hàm trợ giúp bạn sử dụng tạo các đối tượng giống như các tác vụ thể hiện ý định thực hiện hiệu ứng phụ và sau đó thư viện nội bộ thực hiện nó cho bạn. Điều này làm cho việc kiểm tra cực kỳ dễ dàng, không cần phải chế giễu và rất hấp dẫn đối với một số người. Tuy nhiên, cá nhân tôi đã nhận thấy điều đó có nghĩa là các bài kiểm tra đơn vị của bạn thực hiện lại phần lớn logic của câu chuyện của bạn - làm cho các bài kiểm tra đó không hữu ích IMO (ý kiến này không được mọi người chia sẻ)
Mọi người thường hỏi tại sao chúng ta không làm điều gì đó như thế với redux có thể quan sát được: với tôi về cơ bản nó không tương thích với Rx thành ngữ bình thường. Trong Rx, chúng tôi sử dụng các toán tử như thế .debounceTime()
gói gọn logic cần thiết để gỡ lỗi, nhưng điều đó có nghĩa là nếu chúng tôi muốn tạo một phiên bản của nó mà không thực sự thực hiện việc gỡ lỗi và thay vào đó phát ra các đối tượng tác vụ với ý định, giờ bạn đã mất sức mạnh của Rx bởi vì bạn không thể chỉ vận hành chuỗi nữa vì chúng sẽ hoạt động trên đối tượng tác vụ đó, không phải là kết quả thực sự của hoạt động. Điều này thực sự khó để giải thích một cách thanh lịch. Nó một lần nữa đòi hỏi sự hiểu biết nặng nề về Rx để hiểu sự không tương thích của các phương pháp. Nếu bạn thực sự muốn một cái gì đó như thế, hãy kiểm tra chu kỳ reduxtrong đó sử dụng cycl.js và hầu hết có các mục tiêu đó. Tôi thấy nó đòi hỏi quá nhiều nghi lễ cho thị hiếu của tôi, nhưng tôi khuyến khích bạn hãy cho nó một vòng quay nếu nó làm bạn hứng thú.
Như ThorbenA đã đề cập, tôi không ngại thừa nhận rằng redux-saga hiện tại (10/13/16) là nhà lãnh đạo rõ ràng trong quản lý hiệu ứng phụ phức tạp cho redux. Nó đã được bắt đầu sớm hơn và có một cộng đồng mạnh mẽ hơn. Vì vậy, có rất nhiều sự hấp dẫn để sử dụng tiêu chuẩn thực tế so với đứa trẻ mới trong khối. Tôi nghĩ thật an toàn nếu bạn sử dụng mà không có kiến thức trước, bạn sẽ gặp một số nhầm lẫn. Cả hai chúng tôi đều sử dụng các khái niệm khá tiên tiến mà một khi bạn "có được", việc quản lý hiệu ứng phụ phức tạp trở nên dễ dàng hơn rất nhiều, nhưng cho đến lúc đó nhiều vấp ngã.
Lời khuyên quan trọng nhất tôi có thể đưa ra là đừng mang vào một trong những thư viện này trước khi bạn cần chúng. Nếu bạn chỉ thực hiện các cuộc gọi ajax đơn giản, có lẽ bạn không cần chúng. redux-thunk thật đơn giản để học và cung cấp đủ cho những điều cơ bản - nhưng càng không đồng bộ thì càng khó (hoặc thậm chí là không thể), nó trở nên khó khăn hơn cho redux-thunk. Nhưng đối với redux-obsable / saga theo nhiều cách, nó tỏa sáng nhất là async phức tạp hơn. Cũng có rất nhiều công đức trong việc sử dụng redux-thunk với một trong những người khác (redux-obsable / saga) trong cùng một dự án! redux-thunk cho những thứ đơn giản phổ biến của bạn và sau đó chỉ sử dụng redux-obsable / saga cho những thứ phức tạp. Đó là một cách tuyệt vời để duy trì hiệu quả, vì vậy bạn không phải chiến đấu với redux-obsable / saga cho những thứ tầm thường với redux-thunk.