Blog>
Snippets

Handling Multiple Concurrent Data Streams in Sagas

Demonstrate managing multiple, concurrent data streams using channels in Redux-Saga to ensure smooth data flow and processing.
import { actionChannel, call, fork, take } from 'redux-saga/effects';

function* handleData(stream) {
  try {
    // Implementation for handling data
    // e.g., yield call(apiService.saveData, stream.payload);
    console.log('Data processed', stream);
  } catch (error) {
    console.error('Error processing data', error);
  }
}
Defines a generator function 'handleData' for processing each data stream.
function* watchDataStreams() {
  const dataChannel1 = yield actionChannel('DATA_STREAM_1');
  const dataChannel2 = yield actionChannel('DATA_STREAM_2');

  while (true) {
    const [stream1, stream2] = yield all([
      take(dataChannel1),
      take(dataChannel2)
    ]);
    yield fork(handleData, stream1);
    yield fork(handleData, stream2);
  }
}
Creates two channels to listen for data streams and processes them concurrently using the 'handleData' function.
import { all, fork } from 'redux-saga/effects';

export default function* rootSaga() {
  yield all([
    fork(watchDataStreams)
  ]);
}
Root saga that forks 'watchDataStreams' allowing the application to handle multiple data streams concurrently.