Redux Saga All effects 正确使用
Redux Saga All effects proper usage
我已经开始使用 Redux-saga,并且一直在学习并行编写 sagas 的高级部分。
目前这是我与 all
方法一起使用的功能,我需要这些在分配给 Nav 组件之前过滤和转换一些页面元数据。
function* CreateNavFromPages(action) {
const menu = action.payload.menu
const menuPagesData = toList(menu.get('pages')).map(
page => {
const title = page.get('title');
const uri = page.get('uri');
return toPageData(title, uri);
}
);
const staticPagesData = menuPagesData.filter(p => p.get('kind') === 'static');
const pages = yield all(
staticPagesData.map(page => backend(PagesApi, page.get('id')))
);
console.log(pages);
const staticPagesMetadata = pages
.filter(({ result, err }) => !err && result.items.length > 0)
.map(result => fromJS(buildMetadata(fromJs(result.items[0]))));
const pagesMetadata = menuPagesData.map(page => {
const key = staticPagesMetadata.findIndex(el => findPage(el, id));
if (key) {
return staticPagesMetadata[key].copy({data: page.get('data')});
}
return page;
});
const nav = Immutable.Map({
position: 'top',
target: 'home',
pagesMetadata
});
const {result, err} = yield backend(Navs.create, nav);
if (err) { ...}
else {
yield put(NavActions.createNavSuccessful(result.nav));
return true;
}
}
function findPage(el, id) {
return el.get('id') === id;
}
backend.js
export default function* backend(...args) {
try {
return { result: yield call(...args)};
}
catch (e) {...}
}
pages_api.js
.....
function get(id) {
return fetch('/api/pages/${id}');
}
export default {get}
当我在我的应用程序上 运行 时,出现以下错误:
uncaught at watchMany
at takeLatest(CREATE_NAV, createNavFromPages)
at createNavFromPages
TypeError: pages.filter is not a function
检查 console.log 时,我看到以下内容:
{size: 2, _origin: 0, _capacity: 2, _level: 5, _root: null, _tail: {Array(2){Generator, Generator}}}
我在这里遗漏了什么吗?
已更新:添加了 PagesApi 定义
如错误提示问题出在这里:
const pages = yield all(
staticPagesData.map(page => backend(PagesApi, page.get('id')))
);
all
效果需要一个原生 javascript 数组作为输入参数,但是您传递的是不可变列表(这是 staticPagesData.map
的 return 类型)。
由于 all
效果不理解 Immutable.js 列表,因此将其视为任何其他对象 - 即它解析为对象本身,这就是您在 [=15] 中看到的=] 消息.
要修复它,您可以例如将不可变列表转换为 javascript 数组,如下所示:
const pages = yield all(
staticPagesData.map(page => backend(PagesApi, page.get('id'))).toJS()
);
我已经开始使用 Redux-saga,并且一直在学习并行编写 sagas 的高级部分。
目前这是我与 all
方法一起使用的功能,我需要这些在分配给 Nav 组件之前过滤和转换一些页面元数据。
function* CreateNavFromPages(action) {
const menu = action.payload.menu
const menuPagesData = toList(menu.get('pages')).map(
page => {
const title = page.get('title');
const uri = page.get('uri');
return toPageData(title, uri);
}
);
const staticPagesData = menuPagesData.filter(p => p.get('kind') === 'static');
const pages = yield all(
staticPagesData.map(page => backend(PagesApi, page.get('id')))
);
console.log(pages);
const staticPagesMetadata = pages
.filter(({ result, err }) => !err && result.items.length > 0)
.map(result => fromJS(buildMetadata(fromJs(result.items[0]))));
const pagesMetadata = menuPagesData.map(page => {
const key = staticPagesMetadata.findIndex(el => findPage(el, id));
if (key) {
return staticPagesMetadata[key].copy({data: page.get('data')});
}
return page;
});
const nav = Immutable.Map({
position: 'top',
target: 'home',
pagesMetadata
});
const {result, err} = yield backend(Navs.create, nav);
if (err) { ...}
else {
yield put(NavActions.createNavSuccessful(result.nav));
return true;
}
}
function findPage(el, id) {
return el.get('id') === id;
}
backend.js
export default function* backend(...args) {
try {
return { result: yield call(...args)};
}
catch (e) {...}
}
pages_api.js
.....
function get(id) {
return fetch('/api/pages/${id}');
}
export default {get}
当我在我的应用程序上 运行 时,出现以下错误:
uncaught at watchMany
at takeLatest(CREATE_NAV, createNavFromPages)
at createNavFromPages
TypeError: pages.filter is not a function
检查 console.log 时,我看到以下内容:
{size: 2, _origin: 0, _capacity: 2, _level: 5, _root: null, _tail: {Array(2){Generator, Generator}}}
我在这里遗漏了什么吗? 已更新:添加了 PagesApi 定义
如错误提示问题出在这里:
const pages = yield all(
staticPagesData.map(page => backend(PagesApi, page.get('id')))
);
all
效果需要一个原生 javascript 数组作为输入参数,但是您传递的是不可变列表(这是 staticPagesData.map
的 return 类型)。
由于 all
效果不理解 Immutable.js 列表,因此将其视为任何其他对象 - 即它解析为对象本身,这就是您在 [=15] 中看到的=] 消息.
要修复它,您可以例如将不可变列表转换为 javascript 数组,如下所示:
const pages = yield all(
staticPagesData.map(page => backend(PagesApi, page.get('id'))).toJS()
);