如何等待ajax响应然后定义对象

时间:2016-12-04 10:00:12

标签: javascript jquery ajax reactjs

我正在制作一个简单的todo应用程序,当我将数据存储在预定义对象中时,应用程序工作正常。 但现在我使用ajax从链接(休息)获取我的数据,遇到问题, path- pages / todo.js

    import React from "react";
    import Todo from "../components/Todo";
    import * as TodoActions from "../actions/TodoActions.js";
    import TodoStore from "../stores/TodoStore";

export default class Settings extends React.Component {
  constructor(){
    super();
    this.getTodos=this.getTodos.bind(this);
    this.state={
      todos: TodoStore.getAll(),
    };
    console.log("STATE",this.state.todos);
  }
  componentDidMount(){
    TodoStore.on("load",this.getTodos);
  }

 getTodos()
 {
   this.setState({
     todos:TodoStore.getAll(),
   });
 }
  reloadTodos(){
    TodoActions.reloadTodos();
  }
  render() {
    const {todos}=this.state;
    const TodoComponents=todos.map((todo)=>{
      return <Todo key={todo.id} {...todo}/>;
    });
        return (
      <div>
        <button onClick={this.reloadTodos.bind(this)}>Reload!!</button>
         <h1>TODO.net</h1>
         <ul>{TodoComponents}</ul>
      </div>
        )
    }
}

path -stores / Todo

import {EventEmitter} from "events";
import * as $ from "jquery";

import dispatcher from "../Dispatcher";
class TodoStore extends EventEmitter
{
  constructor(){
    super()
    this.todos=[];
  }
  createTodo(text)
  { const id=Date.now();
    this.todos.push({
      id,
      text,
      complete:false
    });
    this.emit("change");
  }
  getAll(){
      $.ajax({
          type: 'GET',
          url: 'http://rest.learncode.academy/api/chitranks/todo',
          success: function(data) {
            console.log("here",data);
            this.todos=data;
            window.todos=this.todos;
          }.bind(this),
          error: function() {
                 alert('error GET connecting to REST');
             }.bind(this)
         });

    return this.todos;
    }
    handleActions(action) {
      switch(action.type){
        case "CREATE_TODO":{
          this.createTodo(action.text);
        }
        case "RECEIVED_TODOS":{
          this.todos=action.todos;
          this.emit("change");
        }
      }

    }
}
const todoStore=new TodoStore;
dispatcher.register(todoStore.handleActions.bind(todoStore));
window.dispatcher=dispatcher;
export default todoStore;

当我键入控制台todos时,我可以看到数据,但它没有呈现(显示未定义)

并且在pages / todo.js文件中,对象未定义

1 个答案:

答案 0 :(得分:0)

由于AJAXasynchronous,您无法从response返回实际数据。而是使用callbacks从响应中获取数据。

这是更新后的代码

import React from "react";
import Todo from "../components/Todo";
import * as TodoActions from "../actions/TodoActions.js";
import TodoStore from "../stores/TodoStore";

export default class Settings extends React.Component {
  constructor(){
    super();
    this.getTodos=this.getTodos.bind(this);
    this.state={
      todos: []
    };
    console.log("STATE",this.state.todos);
  }
  componentWillMount(){
    this.getTodos();//directly hydrating store with todos.
  }
  getTodos()
  {
   var _this = this; //context saved to another variable to use this in anonymous function as callback
   TodoStore.getAll(function(todos){
      _this.setState({
       todos: todos,
      }, function(){ console.log("updated TODOS::", _this.state.todos)});
   });
  }
  reloadTodos(){
    TodoActions.reloadTodos();
  }
  render() {
    const {todos}=this.state;
    const TodoComponents=todos.map((todo)=>{
      return <Todo key={todo.id} {...todo}/>;
    });
    return (
      <div>
        <button onClick={this.reloadTodos.bind(this)}>Reload!!</button>
         <h1>TODO.net</h1>
         <ul>{TodoComponents}</ul>
      </div>
    )
  }
}

和你的商店

import {EventEmitter} from "events";
import * as $ from "jquery";

import dispatcher from "../Dispatcher";
class TodoStore extends EventEmitter{
    constructor(){
     super()
     this.todos=[];
    }
    createTodo(text){ 
     const id=Date.now();
      this.todos.push({
       id,
       text,
       complete:false
      });
      this.emit("change");
    }
    getAll(callback){ //call this on componentWillMount() (required)
        $.ajax({
          type: 'GET',
          url: 'http://rest.learncode.academy/api/chitranks/todo',
          success: function(data) {
            console.log("here",data);
            this.todos=data; //store gets hydrated with todos
            if(typeof callback == "function"){
        callback(data) //giving data to callback
            }
            window.todos=this.todos; //not necessary other than for checking in console
          }.bind(this),
          error: function() {
                 alert('error GET connecting to REST');
             }.bind(this)
         });
    return this.todos; //not the proper palce to retutn
    }
    handleActions(action) {
      switch(action.type){
        case "CREATE_TODO":{
          this.createTodo(action.text);
        }
        case "RECEIVED_TODOS":{
          this.todos=action.todos;
          this.emit("change");
        }
      }

    }
}
const todoStore=new TodoStore;
dispatcher.register(todoStore.handleActions.bind(todoStore));
window.dispatcher=dispatcher;
export default todoStore;