Ich baue eine einfache Todo-App mit React (mit Redux) und Parse. Ich habe ein ernstes Problem beim Verständnis des asynchronen Ladens eines Objekts.Reactjs mit Parse.com asynchroner Ladefehler? Kann nicht auf Objekt zugreifen
Fall # 1:
var todos = this.props.todos;
console.log(todos) // I see [{TodoClass} {TodoClass}]
console.log(todos[0]) // I see {id: "xyz123", content: "hello world"}
Fall # 2:
var todos = this.props.todos;
console.log(todos) // I see []
console.log(todos[0]) // undefined
console.log(todos[0].id) // error; can't access id
Emphasis - todos auf dem Server besiedelten; Ich versuche nicht, auf ein leeres Array zuzugreifen, aber durch Hinzufügen des Zugriffs .id
wird das Todos-Array leer.
Ich stecke fest. Ich vermute, dass sich die Ladefolge ändert, wenn ich auf "id" zugreife, aber ich weiß nicht, wie ich das beheben soll. Bitte schlagen Sie Korrekturen vor. Jede Hilfe wird sehr geschätzt.
TodoClass.js:
function TodoClass(id, content) {
this.id = id;
this.content = content;
}
export default TodoClass
Durch die Verwendung von Parse Query() Versprechen, Landkarte ich die Daten und speichert in meiner TodoClass Instanz für jede "Reihe" von Parse db, und die Daten zu speichern. Ich sehe den Redux-Viewer korrekt aktualisiert.
Dies ist, wo ich es laden, TodoList.jsx:
var TodoList = React.createClass({
render: function() {
var todos = this.props.todos; <-- Array of TodoClass instances
var renderData =() => {
console.log(todos)
console.log(todos[0])
//console.log(todos[0].id) <-- Gives me issues.
var elements = [];
for (var i = 1; i< 5; i++) {
elements.push(<BrowseItem key={i} todo={todos[i]}/>)
};
return elements;
};
return (
<div > {renderData()} </div>
);
}
});
export default connect((state) => {return state})(TodoList);
Grundsätzlich, wenn ich die letzte Zeile 'Konsole„Kommentar out“. log (todos [0] .id) 'dann sehe ich nun alles, was ich im ersten Fall gesehen habe, als identisch. Nichts auf den Daten der Datenbank hat sich geändert, also habe ich 3 Parse-Elemente. Ich versuche nicht auf leere Arrays zuzugreifen. Irgendwie wird Array leer, wenn '.id' versucht wird zuzugreifen. Die dritte Zeile von 'console.log()' wirkt sich auf das erste und zweite aus. – jbro
Bitte beachten Sie, dass beim erstmaligen Laden der Komponente bei einem asynchronen Laden wahrscheinlich ein leeres Array angezeigt wird und erst dann mit den geladenen Todos aktualisiert wird. Es wird nicht "leer", es ist immer leer beim ersten Lauf. Das zweite Snippet löst einen Fehler aus und wird nicht aktualisiert, wenn ein Array gefüllt wird. –
danke für die Klärung. Ja, das ist das Problem, das ich versuche zu lösen. Es läuft asynchron. Wenn Sie einen Weg kennen, um dieses Problem zu umgehen, schlagen Sie bitte vor. – jbro