Jquery 从服务器获取的对象数组和JS中硬编码的对象数组之间存在差异,不确定原因

Jquery 从服务器获取的对象数组和JS中硬编码的对象数组之间存在差异,不确定原因,jquery,arrays,object,jquery-select2,Jquery,Arrays,Object,Jquery Select2,从服务器获取对象数组数据的代码: var tag_Arr= []; var fbref = firebase.database().ref(); fbref.child('tags').limitToFirst(1).on("child_added", function(e) { // console.log(e.key + ' ' + e.val().tagname); var obj = {id:e.key, tex

从服务器获取对象数组数据的代码:

    var tag_Arr= [];
    var fbref = firebase.database().ref();

    fbref.child('tags').limitToFirst(1).on("child_added", function(e) {
            // console.log(e.key + ' ' + e.val().tagname);
            var obj =  {id:e.key, text:e.val().tagname};
            tag_Arr.push(obj);
});
用Js硬编码的数组对象

var data2 = [];
         var obj1 = {id:0, text:"ding"};
         data2.push(obj1);
为什么这两者的控制台日志输出不同,

如何像转换第二个数组一样转换第一个数组?因为第一个输出没有加载到Select2 Jquery文本框中,第二个输出正在加载

我正在将firebase结果加载到一个数组对象中,然后使用select2推送该数据。选择下面带有firebase输入的2代码

var dataNew = tag_Arr;

  $(".myselect").select2({
                placeholder: "select a tag",
                data: dataNew 
        });
“dataNew”未加载。但如果我给出“数据2”,它正在加载


甚至,我也尝试通过JSON.parse解析Firebase输出,但它抛出了未捕获的异常错误。

从屏幕截图判断,在您执行
控制台.log()时,该对象显然没有添加到第一个数组中。检查网络选项卡以查看firebase调用是否实际获取数据。如果有,最好在代码中的这一点上为该特定数组推迟
console.log()

var obj =  {id:e.key, text:e.val().tagname};
tag_Arr.push(obj);
console.log(tag_Arr);
根据新信息进行编辑

您只需将select2初始化移动到firebase ref的回调中,如下所示:

fbref.child('tags').limitToFirst(1).on("child_added", function(e) {
        // console.log(e.key + ' ' + e.val().tagname);
        var obj =  {id:e.key, text:e.val().tagname};
        tag_Arr.push(obj);
        //if this is the first time it should receive data
        $(".myselect").select2({
            placeholder: "select a tag",
            data: tag_Arr
        });
        //else you want to update the data
        $(".myselect").select2("data", tag_Arr, true);
});

firebase调用是异步调用,因此,如果您在select2文本框中加载这些值,则在将这些值加载到数组对象中,然后将它们按入select2时,该调用将为空。这应该行得通,对吧?你能把firebase的输出放进去吗,你是如何解析和出错的?当我展开时,两个数组的输出是一样的。内容在控制台日志中可见。但是strangly第一个数组并没有在select2中加载,而第二个数组正在加载…是的。有人评论说firebase是异步的。因此,您需要在回调中输入代码,以使用firebase返回的数据填充select2。如果您将select2代码添加到问题中,以便我们可以查看您如何绑定数据,这可能会有所帮助。我已更新了我的答案。让我知道这是否对你有效谢谢你,这是有效的。但是我想知道早期代码的问题是什么。我已经做了一些调试,据我所知,“由于firebase是一个异步调用,在select2框加载空数组值之前加载数组需要一些时间。”还有,Kennasoft,我们为什么需要下面的代码//否则您要更新数据$(“.myselect”)。选择2(“数据”,tag_Arr,true);