原来,这是我的代码组织/ Redux的问题。
我无法弄清楚如何实现某种形式的解决方案就像砥Ø建议,因为:
- 如果我率先打响请求我没有办法附上LOCALID并用它找回来响应跟踪它
- 如果我在reducer中首先创建本地项目,我无法将localID传递给执行请求的部分,并存储从响应中提取的项目/我认为从一个减速器
我做了什么我nstead这似乎运作良好,是:
- 大火,被在后台
- 劳动者创造LOCALID并将其传递到两个新的行动拾起成为工人的第一个动作:一个用于创建本地用于发射的请求到数据库
这里的项目,一个是我的代码解决方案,与终极版+英雄传奇+纳基+经典的待办事项列表例如:
export default kea({
path:() => ["kea", "taskStore"],
actions:() => ({
addTask: title => ({ title }),
storeLocalTask: (localId, title) => ({ localId, title }),
storeDBTask: (localId, task) => ({ localId, task }),
setTasks: tasks => ({ tasks }),
fetchTasks:() => ({})
}),
*start() {
const { fetchTasks } = this.actions;
yield put(fetchTasks());
},
reducers: ({ actions }) => ({
indexedTasks: [
{},
PropTypes.object,
{
[actions.setTasks]: (state, payload) => indexById(payload.tasks),
[actions.storeLocalTask]: (state, payload) => {
const { localId, title } = payload;
return { ...state, [localId]: { localId, title } };
},
[actions.storeDBTask]: (state, payload) => {
const { localId, task } = payload;
const { [localId]: _dispose_, ...rest } = state;
return { ...rest, [task.id]: task };
}
}
]
}),
takeLatest: ({ actions, workers }) => ({
[actions.fetchTasks]: workers.fetchTasks,
[actions.addTask]: workers.createTask
}),
workers: {
*fetchTasks() {
const res = yield db.query({
query: gql`
query {
allTasks {
id
title
}
}
`
});
const { setTasks } = this.actions;
yield put(setTasks(res.data.allTasks));
yield delay(1000);
},
*createTask(action) {
const { storeLocalTask, storeDBTask } = this.actions;
const { title } = action.payload;
const localId = randomString();
yield put(storeLocalTask(localId, title));
const res = yield db.mutate({
mutation: gql`
mutation($title: String!) {
createTask(title: $title) {
id
title
}
}
`,
variables: { ...action.payload }
});
yield put(storeDBTask(localId, res.data.createTask));
yield delay(1000);
}
}
});
原来这是鳕鱼的问题e组织/ Redux我有。请参阅下面的答案。现在我的问题不像我想的那么清楚/有用,我应该删除它吗? (或以某种方式改进它?) –