javascript - 为什么我的数组在我的循环中不起作用
问题描述
我有下一个代码...
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。该函数仅适用于创建的原始数组。
请帮助我我想随机化我的所有数组,而我的代码只随机化前三个数字(原始数组)。
解决方案
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);
});
});
});
}