Es stellte sich heraus, es war ein Problem der Code-Organisation/Redux, die ich hatte.
Ich konnte nicht herausfinden, wie eine Art von Lösung zu implementieren, wie Tobe O vorgeschlagen, weil:
- Wenn ich die Anfrage zuerst gefeuert ich keine Möglichkeit hatte, um den localId zu befestigen und wieder mit der get Antwort, um es zu verfolgen
- Wenn ich das lokale Element zuerst in einem Reducer erstellt habe, konnte ich die localID nicht an den Teil übergeben, der die Anfrage ausführt, und speichert das aus der Antwort extrahierte Element/Ich denke, es ist eine schlechte Übung, Aktionen von einem zu werfen Reduzierstück
Was ich tat ich nstead, die gut zu funktionieren scheint, ist:
- Feuer eine erste Aktion, die
von einem Arbeiter oben im Hintergrund aufgenommen wird
- der Arbeiter den localId schafft und übergibt sie an zwei neue Aktionen: eine für die lokale Erstellung Artikel und ein für die Anforderung an die Datenbank
Hier sind meine Lösung in Code, mit Redux + Sagas + Kea + klassischem toDo-Liste Beispiel Brennen:
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);
}
}
});
Stellt sich heraus, es war ein Problem der Kabeljau Die Organisation/Redux, die ich hatte. Siehe meine Antwort unten. Jetzt fühlt sich meine Frage nicht so klar/nützlich an, wie ich es beabsichtigt habe, sollte ich sie löschen? (oder verbessern Sie es irgendwie?) –