Sagen Sie, ich habe einen TodoStore. Der TodoStore ist verantwortlich für die Aufbewahrung meiner TODO-Artikel. Todo-Elemente werden in einer Datenbank gespeichert.Asynchrone Daten laden in Fluss speichert
Ich möchte wissen, was die empfohlene Methode zum Laden aller Todo-Elemente in den Laden ist und wie die Ansichten mit dem Laden interagieren sollten, um die TODO-Elemente beim Start zu laden.
Die erste Alternative besteht darin, eine loadTodos
Aktion zu erstellen, die die Todos aus der Datenbank abruft und ein TODOS_LOADED
Ereignis ausgibt. Ansichten rufen dann die Aktion loadTodos
auf und hören dann das Ereignis TODOS_LOADED
und aktualisieren sich dann selbst, indem sie TodoStore.getTodos()
anrufen.
Eine andere Alternative ist, keine loadTodos
Aktion zu haben, und haben Sie eine TodoStore.getTodos()
, die ein Versprechen mit den vorhandenen TODO-Elemente zurückgibt. Wenn der TodoStore die TODO-Elemente bereits geladen hat, werden sie einfach zurückgegeben. Wenn nicht, fragt es die Datenbank ab und gibt die abgerufenen Elemente zurück. In diesem Fall wird das Ereignis TODOS_LOADED nicht ausgegeben, obwohl das Geschäft jetzt die TODO-Elemente geladen hat, da getTodos
keine Aktion ist.
function getTodos() {
if (loaded)
return Promise.resolve($todoItems);
else
return fetchTodoItemsFromDatabase().then(todoItems) {
loaded = true;
$todoItems = todoItems;
return $todoItems;
});
}
Ich bin sicher, viele werden sagen, dass die Fluss Architektur bricht, weil die getTodos
Funktion den Speicher Zustand ändert, und speichern Staat sollte nur wenn Aktionen eingesandt vom Dispatcher geändert werden.
Wenn Sie jedoch berücksichtigen, dass der Status für den TodoStore die vorhandenen TODO-Elemente in der Datenbank ist, ändert getTodos
keinen Status wirklich. Die TODO-Elemente sind genau gleich, daher muss keine Ansicht aktualisiert oder benachrichtigt werden. Die einzige Sache ist, dass der Speicher jetzt die Daten bereits abgerufen hat, so dass er jetzt im Speicher zwischengespeichert wird. Aus Sicht der Ansicht sollte es nicht wirklich wichtig sein, wie der Store implementiert ist. Es sollte nicht wirklich wichtig sein, ob der Speicher noch Daten aus der Datenbank abrufen muss oder nicht. Alle Ansichten interessieren sich dafür, dass sie den Store verwenden können, um die TODO-Elemente zu erhalten, und dass der Store sie benachrichtigen wird, wenn neue TODO-Elemente erstellt, gelöscht oder geändert werden.
Daher sollten Ansichten in diesem Szenario nur ToDoStore.getTodos() aufrufen, um sich selbst beim Laden zu rendern, und einen Ereignishandler auf TODO_CHANGE registrieren, um benachrichtigt zu werden, wenn sie sich aufgrund eines Hinzufügens, Löschens oder Änderns selbst aktualisieren müssen .
Was halten Sie von diesen beiden Lösungen? Gibt es andere Lösungen?