คือ store.dispatch ใน Redux synchronous หรือ asynchronous


106

ฉันรู้ว่านี่เป็นคำถามพื้นฐาน แต่ฉันไม่มีโชคในการหาคำตอบจากที่อื่น

คือstore.dispatchในการซิงโครหรือไม่ตรงกันRedux?

ในกรณีที่เป็นแบบอะซิงโครนัสมีความเป็นไปได้ที่จะเพิ่มการเรียกกลับหลังจากการดำเนินการได้รับการเผยแพร่ตามที่เป็นไปได้Reactหรือไม่?


สังเกตว่าสถานะมีการอัพเดตแบบซิงโครนัส ( getState()) แต่mapStateToPropsไม่ ดังนั้นthis.props.valueค่าเก่าในขณะที่getState().valueเป็นค่าใหม่--codeandbox.io/s/reactredux-forked-0m5eo?file=/Page.js
Mosh Feu

คำตอบ:


91

AFAIK การดำเนินการจัดส่งเป็นแบบซิงโครนัส ในกรณีที่คุณยินดีที่จะจัดการกับการโทรแบบอะซิงโครนัสคุณสามารถใช้thunk-middlewareใน redux ซึ่งการจัดส่งมีให้เป็นฟังก์ชันการโทรกลับซึ่งคุณสามารถเรียกใช้ได้ตามความสะดวกของคุณ สำหรับข้อมูลเพิ่มเติมโปรดดูคำตอบนี้ใน SO by Author เอง: จะส่งการดำเนินการ Redux ด้วยการหมดเวลาได้อย่างไร


แต่หลายคนแนะนำฉัน: อย่าเรียกการจัดส่งในโฟลว์ async ซึ่งทำให้สถานะ redux ไม่สามารถคาดเดาได้คุณควรซิงค์เพื่อเรียกการจัดส่ง แต่มิดเดิลแวร์เพียงโทรหาผู้จัดส่งหลังจากรอนั่นคือการไหลแบบ async ความเห็นใดถูกต้อง ขอโทษที่ภาษาอังกฤษไม่ดี :)
นิวเคลียร์

ฉันไม่แน่ใจเกี่ยวกับความท้าทายที่คุณกำลังเผชิญอยู่ แต่แนวคิดโดยรวมของการใช้thunkการดำเนินการคือเพื่ออำนวยความสะดวกในการไหลของโค้ดแบบ async เช่นผู้ใช้สามารถส่งการดำเนินการได้เมื่อทำตามสัญญา
agpt

69

ไม่มีใครรู้ดีกว่ารหัสตัวเอง =) อย่างที่คุณเห็นdispatchคือซิงโครนัสอย่างแน่นอน คำเตือนเดียวที่นี่คือวิธีการจัดเก็บenhancersสามารถ (และทำ) แทนdispatchได้ ตัวอย่างเช่นลองดูที่applyMiddlewareตัวเพิ่มประสิทธิภาพซึ่งช่วยให้คุณสามารถเชื่อมต่อมิดเดิลแวร์ได้โดยการแทนที่dispatchวิธีการเริ่มต้นด้วยการใช้งานของมันเอง แม้ว่าฉันไม่เคยเห็น Redux ใด ๆenhancerที่จะลบลักษณะซิงโครนัสของdispatch.


1
คุณควรอัปเดตลิงก์ใช้มิดเดิลแวร์ไปที่https://github.com/reduxjs/redux/blob/master/src/applyMiddleware.ts#L19 (เนื่องจากการย้ายข้อมูล redux จาก js -> ts ฉันไม่สามารถทำการแก้ไขได้ เนื่องจากมัน <6 ตัวอักษร) หรือบางทีคุณควรอ้างอิงการกระทำเมื่อพวกเขายังคงใช้ js เหมือนในcode itselfลิงก์ของคุณซึ่งจะทำให้ลิงก์ตายเนื่องจากลักษณะการคอมมิต 'ลิงก์ถาวร'
user7413060
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.