का उपयोग करके घटनाओं को कतार और रद्द करें डाउनलोड प्रबंधक के उदाहरण को देखते हुए। सक्रिय डाउनलोड की कोई संख्या हो सकती है।म्यूज़ोमैटिक रेडक्स अवलोकन योग्य
कार्यों को शुरू करने, रोकने, चिह्नित करने और किसी भी विशेष डाउनलोड की डाउनलोड प्रगति को चिह्नित करने के लिए भेजा जा सकता है।
const START_DOWNLOAD = "START_DOWNLOAD";
const startDownload = payload => ({ type: START_DOWNLOAD, payload });
const DOWNLOAD_PROGRESS = "DOWNLOAD_PROGRESS";
const downloadProgress = payload => ({ type: DOWNLOAD_PROGRESS, payload });
const STOP_DOWNLOAD = "STOP_DOWNLOAD";
const stopDownload = payload => ({ type: STOP_DOWNLOAD, payload });
const COMPLETE_DOWNLOAD = "COMPLETE_DOWNLOAD";
const completeDownload = payload => ({ type: COMPLETE_DOWNLOAD payload });
इन कार्यों एक आईडी शामिल डाउनलोड पहचानने में मदद करेंगे और निम्नलिखित कम करने का उपयोग कर redux राज्य संशोधित कर सकते हैं:
const downloadReducer = (state = initialState, action) => {
switch (action.type) {
case STOP_DOWNLOAD:
return {
...state,
[action.payload.id]: {
state: "IDLE",
},
};
case START_DOWNLOAD:
return {
...state,
[action.payload.id]: {
state: "IN_PROGRESS",
progress: 0,
},
};
case DOWNLOAD_PROGRESS:
return {
...state,
[action.payload.id]: {
state: "IN_PROGRESS",
progress: action.payload.progress,
},
};
case COMPLETE_DOWNLOAD:
return {
...state,
[action.payload.id]: {
state: "DONE",
progress: 100,
},
};
default:
return state;
}
};
अब कैसे का उपयोग कर इन कार्यों में से async प्रेषण का प्रबंधन करने पर इस मुद्दे की बात आती है रेडक्स देखने योग्य।
उदाहरण के लिए हम कुछ इस तरह कर सकता है:
const downloadEpic = action$ =>
action$.ofType(START_DOWNLOAD).mergeMap(action =>
downloader
.takeUntil(
action$.filter(
stop =>
stop.type === STOP_DOWNLOAD &&
stop.payload.id === action.payload.id,
),
)
.map(progress => {
if (progress === 100) {
return completeDownload({
id: action.payload.id
});
} else {
return downloadProgress({
id: action.payload.id,
progress
});
}
}),
);
यह काम करता है। हालांकि, अगर हम सक्रिय डाउनलोड की संख्या को सीमित करना चाहते हैं तो क्या होगा। के साथ हम mergeMap
को प्रतिस्थापित कर सकते हैं ताकि केवल एक समय में एक सक्रिय डाउनलोड की अनुमति हो सके। या हम concurrent parameter को mergeMap
पर आपूर्ति कर सकते हैं और निर्दिष्ट कर सकते हैं कि आंतरिक डाउनलोडर के कितने निष्पादन देखने योग्य हैं, हम एक बार में अनुमति देना चाहते हैं।
हालांकि, यह समस्या के साथ आता है कि अब हम कतार डाउनलोड बंद नहीं कर सकते हैं।
I have created a complete working example that you can try here.
आप कैसे सीमित कर सकते हैं और कतार डाउनलोड सबसे मुहावरेदार तरीका संभव में rxjs और redux नमूदार का उपयोग कर?
मैं आरएक्सजेएस से बात नहीं कर सकता, लेकिन आप इसे अपने स्टोर को सामान्य करने, आईडी द्वारा अपने डाउनलोड को संग्रहीत करके, अपने सक्रिय डाउनलोड को संग्रहीत करने, डॉउलोड आईडी की सरणी में डाउनलोड कतारबद्ध करने और फिर राज्य को पढ़ने के लिए रेडक्स थंक जैसे मिडलवेयर का उपयोग करके हल कर सकते हैं। और जांचें कि क्या आपके अधिकतम कतारबद्ध डाउनलोड तक पहुंचे हैं, फिर संबंधित कार्यों को प्रेषित करें। यदि आप चाहें तो मैं आरएक्सजे के बिना उत्तर प्रदान कर सकता हूं? –
@ मैथ्यू-ब्रेंट धन्यवाद, हालांकि, मुझे समस्या के समाधान में कम दिलचस्पी है और इस बात को लेकर अधिक दिलचस्पी है कि इसे मूर्खतापूर्ण रेडक्स का उपयोग करके हल किया जा सकता है। – Eamonn
रेडक्स स्टोर में एक पब सब पैटर्न शामिल करता है। आप स्टोर परिवर्तनों को सुनने के लिए store.subscribe का उपयोग कर सकते हैं ... हो सकता है कि यह सिर्फ मुझे ही, लेकिन जब आप लाइब्रेरी में मौजूदा कार्यक्षमता का उपयोग कर सकते हैं तो उसी कार्यक्षमता को फिर से लिखना क्यों? –