다운로드 관리자의 예를 들어 보겠습니다. 활성 다운로드는 여러 번있을 수 있습니다.idiomatic redux를 사용하여 대기열 및 취소 이벤트를 관찰 할 수 있습니다.
작업을 시작하고 중지하고 완료를 표시하고 특정 다운로드의 다운로드 진행률을 표시 할 수 있습니다.
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 });
이러한 작업은 다운로드를 식별하는 ID를 포함하고 다음 감속기를 사용하여 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;
}
};
지금 사용하여 이러한 작업의 비동기 파견을 관리하는 방법에 문제가 온다 관측 가능하다.
예를 들어 우리는 이런 식으로 뭔가를 할 수 :
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
을 concatMap
으로 대체하면 한 번에 하나의 활성 다운로드 만 허용 할 수 있습니다. 또는 concurrent parameter을 mergeMap
에 제공하고 내부 다운로더 관찰 가능 항목의 실행 횟수를 정확히 지정할 수 있습니다.
그러나이 문제는 현재 대기중인 다운로드를 중단 할 수 없다는 문제가 있습니다.
I have created a complete working example that you can try here.
는 어떻게 제한 할 수 있습니다 및 대기열 다운로드 가능한 가장 관용적 인 방법으로 rxjs 및 REDUX 관찰을 사용하고 계십니까?
나는 RXJS와 이야기 할 수는 없지만 상점을 정규화하고, ID로 다운로드를 저장하고, 활성 다운로드를 저장하고, 다운로드 된 대기열에 저장된 다운로드를 ID 배열에 저장 한 다음 Redux 썽크와 같은 미들웨어를 사용하여 상태를 읽을 수 있습니다 대기열에있는 최대 다운로드에 도달했는지 확인한 다음 해당 작업을 발송하십시오. 원할 경우 RxJ없이 답을 제공 할 수 있습니까? –
@ matthew-brent 그러나이 문제에 대한 해결책에는 관심이없고 관용적 인 관행을 사용하여이를 해결할 수있는 방법에 더 관심이 있습니다. – Eamonn
돌아 오는 상점으로 바 부 패턴을 포함한다. store.subscribe를 사용하여 저장소 변경 내용을 수신 할 수 있습니다. 아마도 라이브러리의 기존 기능을 사용할 수있을 때 동일한 기능을 다시 쓰는 이유는 무엇일까요? –