Skip to content

Instantly share code, notes, and snippets.

@anyley
Created September 1, 2016 23:01
Show Gist options
  • Save anyley/537cb40db23e2cdf85818d822c06ed1d to your computer and use it in GitHub Desktop.
Save anyley/537cb40db23e2cdf85818d822c06ed1d to your computer and use it in GitHub Desktop.
saga websocket iterator
// Event iterator for socket events
function socketEventIterator(event) {
let deferred
socket.subscribe(event, payload => {
if(deferred) {
deferred.resolve(payload)
deferred = null
}
}
return {
nextEvent() {
if(!deferred) {
deferred = {}
deferred.promise =
new Promise(resolve => deferred.resolve = resolve)
}
return deferred.promise
}
}
}
function* listenToSocket(event, actionType) {
const { nextEvent } = yield call(socketEventIterator, event)
while (true) {
const payload = yield call(nextEvent)
yield put({ type: actionType, payload })
}
}
function* subscribeSocket(getState) {
while (true) {
const nextAction = yield take(SUBSCRIBE_SOCKET)
const subscribeConfig = nextAction.payload
const { event, actionType } = subscribeConfig
yield fork(listenToSocket, event, actionType)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment