反应 redux saga websocket 币安流
react redux saga websocket binance stream
无法派发来自saga的action,请查看foo saga,这里是完整的代码和最近的推送
github link
我可以知道我哪里出错了吗?没有 saga 它工作正常,但我想用 saga 实现贸易应用程序。
import { takeEvery, put, call, take } from 'redux-saga/effects'
import {
updateMarketPairs
} from '../actions/updateMarketPairs'
export default function* marketPairsSagas() {
yield takeEvery("UPDATE_MARKET_PAIRS", connectSocketStreams)
}
function doAction (data){
let ticker = {}
data.forEach(item => {
let symbol = item.symbol || item.s;
ticker[symbol] = {
symbol: symbol,
lastPrice: item.lastPrice || item.c,
priceChange: item.priceChange || item.p,
priceChangePercent: item.priceChangePercent || item.P,
highPrice: item.highPrice || item.h,
lowPrice: item.lowPrice || item.l,
quoteVolume: item.quoteVolume || item.q,
}
})
return ticker;
}
function* foo (tickerdata) {
console.log("yielding"); // appears in console
console.log('after yielding tickerdata',tickerdata);
yield put(updateMarketPairs(tickerdata)); // action *is not* dispatched
console.log("yielded"); //appears in console
}
function connectSocketStreams(action) {
const payload = action.payload
const allStreams = payload.streams && payload.streams.join('/');
let connection = btoa(allStreams);
connection = new WebSocket(`wss://stream.binance.com:9443/stream?streams=${allStreams}`);
connection.onmessage = evt => {
// yield put({ type: 'ACTION_TYPE', payload: JSON.parse(evt.data)})
let tickerdata = doAction(JSON.parse(evt.data).data);
const iter = foo(tickerdata);
iter.next();
// yield put(updateMarketPairs(tickerdata));
console.log('tickerdata saga---->',tickerdata);
}
connection.onerror = evt => {
console.error(evt);
}
// yield put(updateMarketPairs(tickerdata));
}
那是因为 foo
是一个生成器,您不能像调用普通函数那样调用它。需要使用redux-saga call
效果
但还有另一个问题:call
效果在 onmessage
处理程序中不起作用。特别针对这种情况,有一个 eventChannel 帮助程序允许 saga 与外部事件源通信。
无法派发来自saga的action,请查看foo saga,这里是完整的代码和最近的推送 github link 我可以知道我哪里出错了吗?没有 saga 它工作正常,但我想用 saga 实现贸易应用程序。
import { takeEvery, put, call, take } from 'redux-saga/effects'
import {
updateMarketPairs
} from '../actions/updateMarketPairs'
export default function* marketPairsSagas() {
yield takeEvery("UPDATE_MARKET_PAIRS", connectSocketStreams)
}
function doAction (data){
let ticker = {}
data.forEach(item => {
let symbol = item.symbol || item.s;
ticker[symbol] = {
symbol: symbol,
lastPrice: item.lastPrice || item.c,
priceChange: item.priceChange || item.p,
priceChangePercent: item.priceChangePercent || item.P,
highPrice: item.highPrice || item.h,
lowPrice: item.lowPrice || item.l,
quoteVolume: item.quoteVolume || item.q,
}
})
return ticker;
}
function* foo (tickerdata) {
console.log("yielding"); // appears in console
console.log('after yielding tickerdata',tickerdata);
yield put(updateMarketPairs(tickerdata)); // action *is not* dispatched
console.log("yielded"); //appears in console
}
function connectSocketStreams(action) {
const payload = action.payload
const allStreams = payload.streams && payload.streams.join('/');
let connection = btoa(allStreams);
connection = new WebSocket(`wss://stream.binance.com:9443/stream?streams=${allStreams}`);
connection.onmessage = evt => {
// yield put({ type: 'ACTION_TYPE', payload: JSON.parse(evt.data)})
let tickerdata = doAction(JSON.parse(evt.data).data);
const iter = foo(tickerdata);
iter.next();
// yield put(updateMarketPairs(tickerdata));
console.log('tickerdata saga---->',tickerdata);
}
connection.onerror = evt => {
console.error(evt);
}
// yield put(updateMarketPairs(tickerdata));
}
那是因为 foo
是一个生成器,您不能像调用普通函数那样调用它。需要使用redux-saga call
效果
但还有另一个问题:call
效果在 onmessage
处理程序中不起作用。特别针对这种情况,有一个 eventChannel 帮助程序允许 saga 与外部事件源通信。