我正在尝试 运行 两个函数 onLoad,一个需要先 运行 以便第二个可以填充一个框列表,但是,第二个没有得到数组

I am trying to run two functions onLoad, one needs to run first so the second one can populate a boxlist, however, the second one doesn't get thearray

我在加载页面时尝试 运行 两个函数。 dataRetrieve() 从 Firebase 集合中获取数据。 populate() 应该用从 dataRetrieve() 检索到的条目填充一个框列表。主要问题是,无论我尝试什么,当我在 dataRetrieve() 之后 运行 populate() 时,它都会将数组列为空。我尝试的最后一件事是:

            async function dataRetrieve(){
                const getAdmins = firebase.functions().httpsCallable('getAdmins');
                        // Passing params to data object in Cloud functinon
                getAdmins({}).then((results) => {
                    admins = results;
                    console.log("admins retrieved");
                    console.log(admins);
                }).then(() => {
                    populate();
                });
            }

async function populate(){

                let list = document.getElementById("user-list");

                //loop through users in out Users object and add them to the list
                for (var i = 0; i < admins.length; i++) {
                    let newItem = document.createElement('option');
                    newItem.innerHTML = admins[i].first + " " +admins[i].last;
                    newItem.id = admins[i].uid;
                    if (i == 0) {
                        newItem.className = "active";
                    }
                    console.log(newItem.innerHTML + "  " + newItem.id)
                    list.appendChild(newItem);
                }

                updateResponse(list.firstChild);

                list.size = admins.length;
                console.log(document.getElementById("user-list").size)
                //collect all the list items
                let listItems = list.querySelectorAll('option');

                //loop through the list itmes and add a click listener to each that toggles the 'active' state
                for (var i = 0; i < listItems.length; i ++) {
                listItems[i].addEventListener('click', function(e) {
                    if (!e.target.classList.contains('active')) {
                    for (var i = 0; i < listItems.length; i ++) {
                        listItems[i].classList.remove('active');
                    }
                    e.target.classList.add('active');
                    
                    updateResponse(e.target);
                    }
                })
                }
            }

此外,admins 是在脚本开头列出的全局变量:

            var admins = [];

我正在尝试 运行 所有这些加载以便我可以立即生成列表 我认为 .next 会导致它在 运行ning 之前等待获取值,但即使将结果作为参数并将其直接传输到函数中,这种方式也会给出未定义的数组。我不明白为什么该函数坚持调用旧数据。请帮助。

我想您知道如何检查页面何时加载。加载页面时调用检索函数。然后您应该在检索函数的末尾调用填充函数。这确保在获取所有数据后调用填充函数

我不确定 updateResponse 函数的作用。如果它没有返回承诺,那么我会首先使 populate 函数同步。另外,除了作为全局变量的填充函数之外,您真的需要在其他地方使用 admins 数组吗?如果没有那么我就把它作为参数传递。

async function dataRetrieve() {
  const getAdmins = firebase.functions().httpsCallable('getAdmins');
  // Passing params to data object in Cloud function
  const results = await getAdmins({})
  console.log("admins retrieved");
  console.log(results);
  // Passing results in populate function
  populate(results.data)
  // If your function returns an array, pass the array itself
}

function populate(admins) {
  let list = document.getElementById("user-list");

  //loop through users in out Users object and add them to the list
  // Using a for-of loop instead so no need to worry about checking the length here
  for (const admin of admins) {
    let newItem = document.createElement('option');
    newItem.innerHTML = admin.first + " " + admin.last;
    newItem.id = admin.uid;
    //if (i == 0) {
    //  newItem.className = "active";
    //}
    console.log(newItem.innerHTML + "  " + newItem.id)
    list.appendChild(newItem);          
  }

  updateResponse(list.firstChild);

  // rest of the logic
}