nodejs不能循环数组对象

时间:2019-09-10 19:58:43

标签: node.js reactjs

我正在尝试从firebase中获取一些数据并将其放在Array中,有问题的值为listquestion。为了进行调试,我尝试使用listquestion.map来显示它,但是没有显示任何内容,但是如果我查看控制台,则Array内有3个对象。我假设错误是当我尝试将数据放入数组中,但我没有找到解决方法

export function onceGetQuestion() {
  var listquestion = [
    {
      answercount: "",
      question: "",
      status: ""
    }
  ];

  db.ref("questions")
    .once("value")
    .then(function(snaps) {
      const foo = snaps.val();
      if (foo !== null) {
        Object.keys(foo).forEach(key => {
          db.ref("questions")
            .child(key)
            .once("value")
            .then(function(snap) {
              var questionlist = listquestion;
              questionlist.push({
                answercount: snap.val().answercount,
                question: snap.val().question,
                status: snap.val().status
              });
              listquestion = questionlist;
            });
        });
      }
    });
  console.log(listquestion);
  return listquestion;

前端(反应)

class HomePage extends Component {
  constructor(props) {
    super(props);

    this.state = {
      listquestion: [],
      done: undefined
    };
  }
 componentDidMount() {
    this.state.listquestion = db.onceGetQuestion();
  }
  render() {
    return (
       questions.map(function(position, i){
         ........ 
       <span >{position.question}</span>
         ........
    }
.......

数组:[1]:https://imgur.com/4hn32Zv

1 个答案:

答案 0 :(得分:1)

这是由于回调。通话时

Object.keys(foo).forEach(key => {
          db.ref("questions")
            .child(key)
            .once("value")
            .then(function(snap) {
              var questionlist = listquestion;
              questionlist.push({
                answercount: snap.val().answercount,
                question: snap.val().question,
                status: snap.val().status
              });
              listquestion = questionlist;
            });

即使已经在函数的全局范围中声明了listquestion,在.then内分配的值也是本地的,因此当您离开.then时该值将不复存在< / p>

因此,您必须在.then内部进行所需的任何处理。

可能的解决方案是从db.ref("questions").once("value")函数返回诺言(onceGetQuestion())。在您的类中创建一种处理方法(该方法将是原始解决方案的then中的代码)。调用函数返回的值的方法.then,并在这种情况下(.then)使用this.setState({})

更改类的状态

一条评论指出了有关异步调用的一个很好的答案:   https://stackoverflow.com/a/16825593/12016897

ref:https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/

ref:https://reactjs.org/docs/state-and-lifecycle.html