为什么在循环中我的数组不起作用

时间:2019-07-14 02:46:37

标签: javascript arrays loops

我有下一个代码...

function feed() {
  var userId = "a";
  var keys = firebase.database().ref('users/' + userId).child("following").once('value').then(function(datakey) {
    let usersPost = {};
    let contador = 0;
    let rangeNumbers = [20, 15, 5];
    datakey.forEach(function(data) {
      let userDB = data.val();
      let userIdFollowing = userDB.id;
      firebase.database().ref('posts/').orderByChild("id").equalTo(userIdFollowing).once('value').then(function(postdatakey) {
        postdatakey.forEach(function(postdata) {
          //Detecta todos los datos de la publicacion
          let postDB = postdata.val();
          let postId = postDB.id;
          usersPost[contador] = postDB;
          rangeNumbers.push(contador);
          contador++;
        });
      });
    });

    //console.log(usersPost);
    //Randomize here

    var randomi = rangeNumbers;
    randomi = shuffle(randomi);
    console.log(randomi);
  });
}

function shuffle(array) {
  var currentIndex = array.length,
    temporaryValue, randomIndex;
  // While there remain elements to shuffle...
  while (0 !== currentIndex) {
    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;
    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }
  return array;
}

此代码将1,2,3添加到我的数组中。 我的新数组是rangeNumbers = [20,15,5,1,2,3]; 但是当我想将其随机化时,我的输出是:

15、20、5、1、2、3。 我当时以为这是随机播放功能中的问题,但这不是问题。

在控制台中,我看到: Array(3)[5,20,15]

但是当我打开时,我可以看到输出15、20、5、1、2、3。 该函数仅适用于创建的原始数组。

请帮助我,我想对我所有的数组进行随机化,而我的代码只能对前三个数字(原始数组)进行随机化。

1 个答案:

答案 0 :(得分:0)

Firebase代码异步运行,并且您在回调函数运行之前对数组进行了改组。您需要将该代码移到回调函数中。

function feed() {
  var userId = "a";
  var keys = firebase.database().ref('users/' + userId).child("following").once('value').then(function(datakey) {
    let usersPost = {};
    let contador = 0;
    let rangeNumbers = [20, 15, 5];
    datakey.forEach(function(data) {
      let userDB = data.val();
      let userIdFollowing = userDB.id;
      firebase.database().ref('posts/').orderByChild("id").equalTo(userIdFollowing).once('value').then(function(postdatakey) {
        postdatakey.forEach(function(postdata) {
          //Detecta todos los datos de la publicacion
          let postDB = postdata.val();
          let postId = postDB.id;
          usersPost[contador] = postDB;
          rangeNumbers.push(contador);
          contador++;
        });
        //Randomize here
        var randomi = rangeNumbers;
        randomi = shuffle(randomi);
        console.log(randomi);
      });
    });
  });
}