2016-02-18 6 views
14

मैंने पढ़ा है कि Redux Thunk एसिंक्रोनस क्रियाओं/अनुरोध को प्रबंधित करने का विश्वसनीय तरीका है। अन्य कार्यों द्वारा कार्यों को प्रेषित करने के बारे में कुछ भी नहीं है।क्या मैं रेडक्स थंक मिडलवेयर के बिना कई क्रियाएं भेज सकता हूं?

तुल्यकालिक कार्यों को प्रेषित करने के बारे में कैसे? मुझे थंक दृष्टिकोण के प्रदर्शन के मुद्दों के बारे में निश्चित नहीं है, लेकिन क्या मैं अंदर कार्य परिभाषित किए बिना अन्य क्रिया निर्माता के अंदर कार्रवाई भेज सकता हूं?

ऐसा लगता है कि रेडक्स थंक का उपयोग इस आवश्यकता के लिए अनावश्यक है।

+0

आप अपने एक्शन क्रिएटर को कई सिंक्रोनस कार्यों को प्रेषित क्यों करना चाहते हैं?यह अनावश्यक संकेत और जटिलता की तरह लगता है। शायद एक बेहतर तरीका है। –

+1

इस उपयोग को यहां वर्णित किया गया है: http://stackoverflow.com/questions/34570758/why-do-we-need-middleware-for-async-flow-in-redux एक ही क्रिया का उपभोग करने वाले मल्टीपल रेड्यूसर के बजाय मैं चाहूंगा अन्य क्रियाओं के साथ कण कार्रवाई को ट्रिगर करें (उदाहरण के लिए, {टाइप: 'DISPLAY_NOTIFICATION' को सूचित करने के लिए, टेक्स्ट: '0} –

उत्तर

32

अधिसूचना दिखा रहा है और छुपा रहा है indeed thunks के लिए एक अच्छा उपयोग मामला प्रतीत होता है।

David’s answer किसी चीज़ के जवाब में कई अपडेट करने के "डिफ़ॉल्ट" तरीके का वर्णन करता है: इसे विभिन्न reducers से संभाल लें। अक्सर यही वह है जो आप करना चाहते हैं।

कभी-कभी (अधिसूचनाओं के साथ) यह असुविधाजनक हो सकता है। मैं वर्णन करता हूं कि my answer to this question में एक या कई कार्रवाइयों को प्रेषित करने के बीच आप कैसे चुन सकते हैं।

यदि आप करते हैं तो एकाधिक कार्रवाइयों को प्रेषित करने का निर्णय लेते हैं, या तो बस इसे अपने घटकों से अनुक्रमिक रूप से करें, या रेडक्स थंक का उपयोग करें। ध्यान दें कि यदि रेडक्स थंक आपके लिए रहस्यमय प्रतीत होता है, तो आपको इसका उपयोग करने से पहले understand what it really is होना चाहिए। यह केवल कोड संगठन के संदर्भ में लाभ प्रदान करता है; हकीकत में यह dispatch() को लगातार दो बार चलाने से अलग नहीं है।

जिसके अनुसार, Redux thunk भेजने कई कार्यों के साथ इस तरह दिखता है:

function increment() { 
    return { type: 'INCREMENT' } 
} 

function incrementTwice() { 
    return dispatch => { 
    dispatch(increment()) 
    dispatch(increment()) 
    } 
} 

store.dispatch(increment()) 
incrementTwice()(store.dispatch) // doesn’t require redux-thunk but looks ugly 
store.dispatch(incrementTwice()) // requires redux-thunk but looks nice 

Redux thunk का उपयोग करते हुए किसी भी प्रदर्शन के मुद्दों के लिए नहीं होगा। यह उन कार्यों को कॉल करने का एक अच्छा तरीका है जिन पर आप अपने dispatch को सौंप सकते हैं ताकि वे इसे जितनी बार चाहें उतनी बार कर सकें।

+3

मुझे यह आवश्यकता कैसे लागू करनी चाहिए कि दूसरा प्रेषण केवल तब शुरू होता है जब पहली प्रेषण राज्य को बदलना समाप्त कर देता है? –

15

क्रियाओं को एक-एक के रूप में बदलने के लिए कार्यों के बारे में सोचने की गलती है। वे वास्तव में कई से कई हैं। याद रखें कि सभी कार्यों को सभी reducers पर बुलाया जाता है।

उदाहरण के लिए, एक ही क्रिया कई राज्य परिवर्तन ट्रिगर हो सकता है:

function firstReducer(state, action) { 
    switch (action.type) { 
     case ACTION_X: 
      // handle action x 
    } 
} 

function secondReducer(state, action) { 
    switch (action.type) { 
     case ACTION_X: 
      // handle action x 
    } 
} 

function thirdReducer(state, action) { 
    switch (action.type) { 
     case ACTION_X: 
      // handle action x 
    } 
} 

इसके विपरीत, एक ही स्थिति परिवर्तन दो अलग-अलग कार्यों से प्रभावित हो सकती है।

function firstReducer(state, action) { 
    switch (action.type) { 
     case ACTION_X: 
     case ACTION_Y: 
      // handle action x and y in the same manner 
    } 
} 

यह एक ही तरीके से दो क्रियाओं को संचालित करने अजीब लग सकता है लेकिन यह केवल एक ही कम करने के संदर्भ में है। अन्य reducers उन्हें अलग-अलग संभालने के लिए स्वतंत्र हैं।

function secondReducer(state, action) { 
    switch (action.type) { 
     case ACTION_X: 
      // handle action x 
     case ACTION_Y: 
      // handle action y 
    } 
} 

function thirdReducer(state, action) { 
    switch (action.type) { 
     case ACTION_X: 
      // handle action x 
     default: 
      // ignore action y 
    } 
} 

इस कई से अधिक रिश्तों के साथ, यह एक कार्य पदानुक्रम के लिए बस अनावश्यक है। यदि आपके पास कई सिंक्रोनस कार्रवाइयों को फायर करने वाले एक्शन क्रिएटर हैं, तो आपका कोड अधिक जटिल और कठिन हो जाता है।

+0

http://redux.js.org/docs/recipes/ReducingBoilerplate.html यहां कार्रवाई में क्रिएटर्स.जेएस मिडलवेयर का उपयोग कर एकल क्रिया निर्माता द्वारा प्रेषित कई क्रियाएं हैं। जटिलता के बजाय यदि हम अन्य क्रियाएं भेज सकते हैं तो यह नए क्रिया प्रकारों के साथ कणिक reducers को फिर से परिभाषित करने से रोक देगा। मैं कल्पना कर सकता हूं कि अधिसूचनाकर्ता को एक नए एक्शन प्रकार के साथ बदला जाना चाहिए क्योंकि मैं इसे भरना चाहता हूं किसी भी अन्य कार्रवाई से राज्य। –

+0

जहां तक ​​मैं कह सकता हूं, उस पृष्ठ पर मौजूद कोई भी उदाहरण एकाधिक सिंक्रोनस क्रियाओं को आग नहीं डालता है। एक सिंक्रोनस LOAD_POSTS_REQUEST कार्रवाई प्रेषित है, अनुसरण करें एसिंक्रोनस LOAD_POSTS_REQUEST/LOAD_POSTS_FAILURE द्वारा संपादित करें। –

1

this के माध्यम से करता है, तो हाँ, का उपयोग करते हुए:

store.dispatch(action1, action2) 

शायद GitHub पर +1?

संबंधित मुद्दे