js输出顺序的问题

来源:3-6 改写站点导航中的下拉菜单

WittChen

2020-05-21 14:10:24

$(document).ready(function () {
    // 头部导航
    var header_nav = $(".header-nav-right-item");
    // 提取数据
    var getData = function (dataFile) {
        var dataObj = $.getJSON(dataFile, function (data) {
            dataObj = data;
            console.log(dataObj);
        });
        return dataObj;
    };

    // 插入数据
    var insertData = function (ele, text) {
        ele.innerHTML = text;
    };
    header_nav.on("hover", function () {
        var ele = this;
        if (!this.getAttribute("status")) {
            // $.getJSON("js/header-data.json", function (data) {
            var a = ele.getElementsByTagName("a");
            // var data_array = data[ele.dataset.type];
            var data_array = getData("js/header-data.json");
            console.log(data_array);
            for (key in a) {
                insertData(a[key], data_array[key]);
                // a[key].innerHTML = data_array[key];
            }
            ele.setAttribute("status", true);
            // })
        }
    })
});

http://img.mukewang.com/climg/5ec61b4f09ac714115210805.jpg

写回答

3回答

好帮手慕慕子

2020-05-21

同学你好,$.getJSON这个方法本身就是异步的,目前没有办法转成同步的,无法直接提取出来封装成一个函数使用。

建议:同学参考老师第一次给出的示例,在$.getJSON方法中,在获取到数据后,再进行其他操作。

祝学习愉快~

0

好帮手慕慕子

2020-05-21

同学你好,因为$.getJSON方法请求数据是异步的,所以会导致下图所示的,1处代码执行时,数据请求还没有返回结果,所以1处打印结果是undefined, 等数据返回了,才会执行2处的代码,输出对应的结果。

http://img.mukewang.com/climg/5ec61db30985753a14280773.jpg

建议:直接在$.getJSON方法中,在获取到数据后,再进行其他操作,示例:

http://img.mukewang.com/climg/5ec61e77099634a009280796.jpg

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

0
hittChen
h 我刚刚开始也是这样写的,因为这个操作很多,所以我想把它提取出来,所以才报了错,有没有办法把这个步骤提取出来,而又不报错的方法呢,减少代码的冗余,或者说有没有同步的方法
h020-05-21
共1条回复

WittChen

提问者

2020-05-21

老师您好,这个问题我第一想到的是预解析,第二我想到的是回调函数;

且听我说的对不对,回调函数我不太理解,也不知道他的运行机制,但是我把它联想到了异步,很多程序异步执行的原理是事件循环,我想回调函数不是不是就是把要执行的放到一个事件循环的队列里了,因为是一个队列因此有执行的先后顺序,因此会引发上面的问题

0

0 学习 · 14456 问题

查看课程