ข้อจำกัดความรับผิดชอบ: ฉันเป็นหนึ่งในผู้เขียนเรื่อง redux-observable ดังนั้นจึงยากสำหรับฉันที่จะเป็นกลาง 100%
ขณะนี้เราไม่ได้ให้เหตุผลใด ๆ ที่สามารถสังเกตได้ว่า redux ดีกว่า redux-saga เพราะ ... ไม่ใช่ 😆
tl; dr มีข้อดีข้อเสียทั้งสองอย่าง หลายคนจะพบว่าหนึ่งใช้งานง่ายกว่าอีกแบบหนึ่ง แต่ทั้งสองอย่างมีความซับซ้อนในการเรียนรู้ในรูปแบบที่แตกต่างกันหากคุณไม่รู้จัก RxJS (redux-observable) หรือเครื่องกำเนิด / "effects as data" (redux-saga)
พวกเขาแก้ปัญหาเดียวกันด้วยวิธีที่คล้ายกันมาก แต่มีความแตกต่างพื้นฐานบางอย่างที่เห็นได้ชัดเมื่อคุณใช้เพียงพอเท่านั้น
redux-observable เลื่อนเกือบทุกอย่างไปที่ RxJS ที่เป็นสำนวน ดังนั้นหากคุณมีความรู้ RxJS (หรือได้รับมัน) การเรียนรู้และใช้การสังเกตซ้ำได้นั้นเป็นเรื่องธรรมชาติสุด ๆ นั่นหมายความว่าความรู้นี้สามารถถ่ายโอนไปยังสิ่งอื่นที่ไม่ใช่เรกซ์ หากคุณตัดสินใจที่จะเปลี่ยนไปใช้ MobX หากคุณตัดสินใจที่จะเปลี่ยนไปใช้ Angular2 หากคุณตัดสินใจที่จะเปลี่ยนไปใช้ความร้อนแรง X ในอนาคตโอกาสที่ RxJS จะช่วยคุณได้นั้นดีมาก เนื่องจาก RxJS เป็นไลบรารี async ทั่วไปและในหลาย ๆ ด้านก็เหมือนกับภาษาโปรแกรมในตัวมันเองนั่นคือกระบวนทัศน์ "Reactive Programming" ทั้งหมด RxJS มีมาตั้งแต่ปี 2012 และเริ่มต้นเป็นพอร์ตของ Rx.NET (มี "พอร์ต" ในเกือบทุกภาษาหลักซึ่งมีประโยชน์มาก )
redux-saga ให้ตัวดำเนินการตามเวลาดังนั้นในขณะที่ความรู้ที่คุณได้รับเกี่ยวกับเครื่องกำเนิดไฟฟ้าและการจัดการผลข้างเคียงในรูปแบบตัวจัดการกระบวนการนี้สามารถถ่ายโอนได้ แต่ตัวดำเนินการและการใช้งานจริงจะไม่ถูกใช้ในไลบรารีหลักอื่น ๆ นั่นเป็นเรื่องโชคร้ายเล็กน้อย แต่ไม่ควรเป็นตัวทำลายข้อตกลงด้วยตัวเอง
นอกจากนี้ยังใช้ "เอฟเฟกต์เป็นข้อมูล" ( อธิบายไว้ที่นี่ ) ซึ่งอาจจะยากที่จะคาดเดาในตอนแรก แต่หมายความว่าโค้ด redux-saga ของคุณไม่ได้ทำผลข้างเคียงเอง ฟังก์ชันตัวช่วยที่คุณใช้จะสร้างอ็อบเจ็กต์ที่เหมือนกับงานที่แสดงถึงเจตนาในการทำผลข้างเคียงจากนั้นไลบรารีภายในจะดำเนินการให้คุณ ทำให้การทดสอบทำได้ง่ายมากโดยไม่ต้องมีการล้อเลียนและเป็นที่ดึงดูดใจสำหรับบางคน อย่างไรก็ตามโดยส่วนตัวแล้วฉันพบว่ามันหมายความว่าการทดสอบหน่วยของคุณนำตรรกะของเทพนิยายของคุณมาใช้อีกครั้งทำให้การทดสอบเหล่านั้นไม่ได้มีประโยชน์มาก IMO (ทุกคนไม่ได้แบ่งปันความคิดเห็นนี้)
คนมักถามว่าทำไมเราไม่ทำอะไรแบบนั้นกับ redux-observable: สำหรับฉันแล้วมันเข้ากันไม่ได้กับ Rx ที่เป็นสำนวนปกติ ใน Rx เราใช้ตัวดำเนินการเช่นนี้.debounceTime()
ที่ห่อหุ้มลอจิกที่จำเป็นในการ debounce แต่นั่นหมายความว่าหากเราต้องการสร้างเวอร์ชันที่ไม่ได้ทำการ debouncing จริง ๆ และปล่อยวัตถุงานออกมาด้วยเจตนาแทนตอนนี้คุณได้สูญเสีย พลังของ Rx เนื่องจากคุณไม่สามารถเชื่อมโยงตัวดำเนินการได้อีกต่อไปเพราะพวกเขากำลังดำเนินการกับวัตถุงานนั้นไม่ใช่ผลลัพธ์ที่แท้จริงของการดำเนินการ นี่เป็นเรื่องยากที่จะอธิบายอย่างหรูหรา ต้องมีความเข้าใจอย่างหนักอีกครั้งเกี่ยวกับ Rx เพื่อทำความเข้าใจความไม่ลงรอยกันของแนวทาง หากคุณต้องการบางสิ่งเช่นนั้นจริงๆให้ตรวจสอบวงจรซ้ำซ้อนซึ่งใช้ cycle.js และส่วนใหญ่มีเป้าหมายเหล่านั้น ฉันคิดว่ามันต้องมีพิธีรีตองมากเกินไปสำหรับรสนิยมของฉัน แต่ฉันขอแนะนำให้คุณหมุนมันถ้าคุณสนใจ
ดังที่ ThorbenA กล่าวถึงฉันไม่อายที่จะยอมรับว่าปัจจุบัน redux-saga (10/13/16) เป็นผู้นำที่ชัดเจนในการจัดการผลข้างเคียงที่ซับซ้อนสำหรับ redux เริ่มต้นขึ้นก่อนหน้านี้และมีชุมชนที่แข็งแกร่งมากขึ้น ดังนั้นจึงมีแรงดึงดูดมากมายในการใช้มาตรฐานทางพฤตินัยกับเด็กใหม่ในบล็อก ฉันคิดว่ามันปลอดภัยที่จะบอกว่าหากคุณใช้โดยไม่ได้รับความรู้มาก่อนคุณกำลังสับสน เราทั้งสองใช้แนวคิดขั้นสูงพอสมควรซึ่งเมื่อคุณ "ได้รับ" ทำให้การจัดการผลข้างเคียงที่ซับซ้อนง่ายขึ้นมาก แต่ก็มีหลายอย่างสะดุด
คำแนะนำที่สำคัญที่สุดที่ฉันสามารถให้ได้คืออย่านำห้องสมุดเหล่านี้เข้ามาก่อนที่คุณจะต้องการ หากคุณเพียงโทรผ่าน ajax ธรรมดาคุณอาจไม่จำเป็นต้องใช้ redux-thunk นั้นโง่ง่ายในการเรียนรู้และให้เพียงพอสำหรับพื้นฐาน - แต่ยิ่ง async ซับซ้อนมากเท่าไหร่ก็ยิ่งยากขึ้น (หรือเป็นไปไม่ได้) ก็จะกลายเป็น redux-thunk แต่สำหรับ redux-observable / saga ในหลาย ๆ ด้านมันส่องแสงที่สุด async ที่ซับซ้อนกว่า นอกจากนี้ยังมีข้อดีอีกมากมายในการใช้ redux-thunk กับหนึ่งในคนอื่น ๆ (redux-observable / saga) ในโครงการเดียวกัน! redux-thunk สำหรับสิ่งง่ายๆทั่วไปของคุณจากนั้นใช้ redux-observable / saga สำหรับสิ่งที่ซับซ้อนเท่านั้น นั่นเป็นวิธีที่ยอดเยี่ยมในการทำงานอย่างมีประสิทธิผลดังนั้นคุณจึงไม่ต้องต่อสู้กับสิ่งที่ซ้ำซากที่สังเกตได้ / เทพนิยายสำหรับสิ่งที่ไม่สำคัญกับ redux-thunk