我有兩個jsx文件。 TodoAPI.jsx有一個名爲getTodos()的函數,它使用axios從mongodb數據庫中獲取數據,並如測試所示那樣成功完成。這個函數通常由TodoApp.jsx中的某些行調用,顯然整個代碼在getTodos()甚至返回數組之前執行。因此,應該由getTodos()填充的所有數組都保持未定義狀態。通過在TodoApp.jsx中使用這個setTimeout(function(){ console.log(TodoAPI.getTodos()); }, 3000);
,我確信我沒有錯,因爲它實際上打印了數組。嘗試通過調用使用axios的函數(異步)來填充數組,並且函數在填充數組之前返回undefined
如何確保getTodos()在代碼的其他部分啓動之前完成?還是有更好的解決方案?
這裏是代碼的相關部分: TodoAPI.jsx:
var $ = require('jquery');
import axios from 'axios';
module.exports = {
setTodos: function (todos) {
if ($.isArray(todos)) {
localStorage.setItem('todos', JSON.stringify(todos));
return todos;
}
},
getTodos: function() {
let todos = [];
axios({
method: 'get',
//url:'https://nameless-island-69625.herokuapp.com/todos',
url: 'http://localhost:3000/todos',
headers:{
'x-auth': localStorage.getItem('x-auth')
}
}).then(function(response) {
todos = $.extend(true, [], response.data.todos);
console.log('successful response from todos');
}).then(() => {
console.log(todos);
return todos;
}).catch((e) => {
console.log('failed response from todos');
console.log(e);
});
// return [{name:'asd'},{name:'qwe'},{name:'fgd'},];
},
TodoApp.jsx:
var React = require('react');
var uuid = require('node-uuid');
var moment = require('moment');
const axios = require('axios');
var TodoList = require('TodoList');
var AddTodo = require('AddTodo');
var TodoSearch = require('TodoSearch');
var TodoAPI = require('TodoAPI');
var TodoApp = React.createClass({
getInitialState: function() {
return {
showCompleted: false,
searchText: '',
todos: TodoAPI.getTodos()
};
},
其餘的代碼可以發現here但我敢肯定,問題出在上面的代碼中。
你有沒有考慮在返回'getTodos東西:)功能({' –
是的,我試過returnin g .then()外,但我得到同樣的問題,只有這次空數組返回而不是未定義。問題在於函數在數據到達之前完成。 –