gpt4 book ai didi

javascript - Redux Saga EventChannel : TypeError: (0, _reduxSaga.take) 不是一个函数

转载 作者:行者123 更新时间:2023-12-03 01:09:54 26 4
gpt4 key购买 nike

我正在尝试使用 websocket 使用 redux saga eventChannel 从第三方 api 获取实时数据,但由于某种原因,我收到如下错误:

enter image description here

//sagas/index.js
import { takeLatest } from "redux-saga";
import { all, fork } from "redux-saga/lib/effects";

import { watchHistoricalPricesSaga } from "./HistoricalPricesSaga";
import { watchLivePricesSaga } from "./LivePricesSaga";

export default function* watcherSaga() {
yield all([fork(watchHistoricalPricesSaga), fork(watchLivePricesSaga)]);
}

//sagas/LivePricesSaga
import { eventChannel, takeEvery, take } from "redux-saga";
import { call, put } from "redux-saga/lib/effects";

function initWebsocket() {
return eventChannel(emitter => {
//Subscription Data
const subscribe = {
type: "subscribe",
channels: [
{
name: "ticker",
product_ids: ["BTC-USD"]
}
]
};

//Subscribe to websocket
let ws = new WebSocket("wss://ws-feed.pro.coinbase.com");

ws.onopen = () => {
console.log("Opening Websocket");
ws.send(JSON.stringify(subscribe));
};

ws.onerror = error => {
console.log("ERROR: ", error);
console.dir(error);
};

ws.onmessage = e => {
let value = null;
try {
value = JSON.parse(e.data);
} catch (e) {
console.error(`Error Parsing Data: ${e.data}`);
}
if (value && value.type === "ticker") {
console.log("Live Price: ", value);
return emitter({
type: "POST_LIVE_PRICE_DATA",
data: value.price
});
}
};

return () => {
ws.close();
};
});
}

function* wsSaga() {
const channel = yield call(initWebsocket);
while (true) {
const action = yield take(channel);
yield put(action);
}
}

export function* watchLivePricesSaga() {
yield takeEvery("START_LIVE_PRICE_APP", wsSaga);
}

//sagas/HistoricalPricesSaga.js
import { takeEvery } from "redux-saga";
import { call, put } from "redux-saga/lib/effects";

import Api from "../api";

function* getHistoricalPrices() {
console.log("getHistricalPrices");
try {
const response = yield call(Api.callHistoricalPricesApi);

yield put({
type: "HISTORICAL_PRICES_CALL_SUCCESS",
historicalPrices: response.data
});
} catch (error) {
yield put({ type: "HISTORICAL_PRICES_CALL_FAILED" });
}
}

export function* watchHistoricalPricesSaga() {
yield takeEvery("GET_HISTORICAL_PRICES", getHistoricalPrices);
}

我尝试通过将两个文件分开来隔离问题,并且 HistoricalPricesSaga 运行良好。所以,问题似乎出在 livePricesSaga 上。此外,该操作正在被调度,正如我可以使用 redux-logger 在控制台中看到的那样。

您还可以在此处查看完整代码:CodeSandbox谢谢!

最佳答案

您需要从 redux-saga/effects 导入 taketakeEvery。这将导致以下结果:

//sagas/index.js
import { all, fork, takeLatest } from "redux-saga/effects";

...

//sagas/LivePricesSaga
import { call, put, takeEvery, take } from "redux-saga/effects";

关于javascript - Redux Saga EventChannel : TypeError: (0, _reduxSaga.take) 不是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52244012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com