2016-06-30 15 views
0

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); 

Antwort

1

Der Grund für die erste snipped Fehler nicht aber die zweite nicht ist, löst dieser einen Fehler, wenn Sie .id zuzugreifen versuchen, auf undefined - was sinnvoll ist. Wenn dort keine Todo-Items vorhanden sind, kann die ID des ersten Items nicht gefunden werden - der Item ist nicht da.

Ihre render Funktion sollte wahrscheinlich überprüfen, ob es irgendwelche todos sind, und gibt einen „Laden“/„nein todos“ Platzhalter hier:

render: function() { 
    var todos = this.props.todos; 
    if (todos.length === 0) { 
    return <div>No todos.</div>; 
    } 
    console.log(...); 
    ... 
    return <div>{renderData()}</div> 
} 
+0

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

+1

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. –

+0

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

Verwandte Themen