Javascript 是让java脚本执行更加同步,还是使用setTimeout来修复某些问题?

Javascript 是让java脚本执行更加同步,还是使用setTimeout来修复某些问题?,javascript,settimeout,synchronous,Javascript,Settimeout,Synchronous,我的下拉列表中填充了一个lil延迟,看起来读取json需要时间,为了解决这个问题,我在UI上设置值时添加了setTimeout self.$(tab+“#viewBy”).val(chartOptions.viewBy); 这很好,但希望有人建议,使其同步是更好的方法,这不会完全修复它,因为加载时没有加载任何选项,只有在单击另一个选项卡时才会加载 populateMenu = function (menuList, drpDownID) {

我的下拉列表中填充了一个lil延迟,看起来读取json需要时间,为了解决这个问题,我在UI上设置值时添加了setTimeout self.$(tab+“#viewBy”).val(chartOptions.viewBy); 这很好,但希望有人建议,使其同步是更好的方法,这不会完全修复它,因为加载时没有加载任何选项,只有在单击另一个选项卡时才会加载

populateMenu = function (menuList, drpDownID) {                                                
     $(tab + " #" + drpDownID).html("");
     $.each(menuList, function (r, v) {
         console.log(tab + " #" + drpDownID+ " val : " + v.title); //this prints fine
         $(tab + " #" + drpDownID).append("<option value='" + v.id + "'>" + v.title + "</option>");
         console.log($(tab + " #" + drpDownID).html()); // this prints undefined for secondMenu
     });
   },

getSecondMenu = function () {
                    $.ajaxSetup({
                        async: false
                    });
                    $.getJSON("./js/abc/myJson.json", function (data) {
                        myJson= data;
                    });

                    for (i = 0; i < myJson.mod.length; i++) {
                        if (myJson.mod[i].id === tab.slice(1)) {
                            secondMenuList= [];
                            for (j = 0; j < myJson.mod[i].ett.length; j++) {
                                v = myJson.mod[i].ett[j];
                                secondMenuList.push(v);
                            }
                            populateMenu(secondMenuList, "viewBy");
                        }
                    }
                    $.ajaxSetup({
                        async: true
                    });
                },

onloadCall = function () {
                    $(self.el).html(self.template());
                    self.$(tab).html(self.cntrlTemplate());  
                    self.$("#firstTab").ready(loadTab);
                    self.$("[id^=tabs-]").click(loadTab);
                    getfirstMenu(); //this drop down is loading fine it's from a ajax call
                    getSecondMenu(); //this comes blank first as I have made json reading sync
                },
populateMenu=函数(menuList,drpDownID){
$(tab+“#”+drpDownID.html(“”);
$.each(菜单列表,函数(r,v){
log(tab+“#”+drpDownID+“val:+v.title);//打印效果良好
$(tab+“#”+drpDownID).append(“+v.title+”);
console.log($(tab+“#”+drpDownID.html());//这将为第二个菜单打印未定义的内容
});
},
getSecondMenu=函数(){
$.ajaxSetup({
异步:false
});
$.getJSON(“./js/abc/myJson.json”),函数(数据){
myJson=数据;
});
对于(i=0;i
更好的方法是保持ajax调用异步,然后使用完成函数或ajax调用的完成通知触发使用这些ajax调用的结果。不需要同步ajax。不需要设置超时()。不需要全局存储。干净

当您使用
setTimeout()
时,您只是在猜测何时完成ajax调用,这不是一件好事(您可能会保守地猜测并迟到,或者您可能会猜测很短的时间,有时在慢速连接时会错过),并且您可能正在将ajax结果存储在某个全局变量中(供您的
setTimeout()
使用,这也是不必要的

如果您发布实际代码,我们可以更具体地建议一种好方法

您的用户非常非常不希望您使用同步ajax。有关用户为什么会喜欢异步ajax的更多信息,请参阅


我建议您改为在成功回调中处理
getJSON()
调用的结果,这样就没有时间问题了:

getSecondMenu = function() {
    $.getJSON("./js/abc/myJson.json", function(myJson) {
        for (i = 0; i < myJson.mod.length; i++) {
            if (myJson.mod[i].id === tab.slice(1)) {
                secondMenuList = [];
                for (j = 0; j < myJson.mod[i].ett.length; j++) {
                    v = myJson.mod[i].ett[j];
                    secondMenuList.push(v);
                }
                populateMenu(secondMenuList, "viewBy");
            }
        }
    });
},
getSecondMenu=function(){
$.getJSON(“./js/abc/myJson.json”),函数(myJson){
对于(i=0;i
Synchronous不是chioce,尽可能避免它。
setTimeout
有它自己的优点,但不是每种情况都有。听起来像是在异步获取JSON,当您尝试应用值“chartOptions.viewBy”时,它还没有填充(即,您的异步调用还没有返回)。如果您可以用一段代码片段来编辑/更新您的问题,该代码片段说明了如何检索JSON以及与UI值设置的关系,我可以给您一个具体的答案。感谢您的回复,这很有帮助。虽然这不是ajax调用,但我正在使用getJSON在UI上阅读JSON,这似乎需要一些时间。@user1724317-
getJSON()
是一个Ajax调用-同样的问题。什么是
UI
?当你不向我们展示你的任何代码或告诉我们你在使用什么库时,我们无法以非常详细的方式帮助你。这就像我们被蒙住了眼睛,你隐藏了大部分问题。@user1724317-没有
setTimeout()
在该代码中。抱歉,如果我的问题不清楚,那么如果我在为UI self上的下拉列表赋值时添加setTimeout,我的东西可以正常工作。$(tab+“#viewBy”).val(chartOptions.viewBy);或者如果我将其与代码中的内容同步(但在加载时不能正常工作)。那么,哪种方法更好。感谢@jfriend00,我最初也有同样的想法,但我必须在UI self上设置一个setTimeout()。$(tab+“#viewBy”).val(chartOptions.viewBy);否则,下拉列表会在几秒钟后填充。所以我认为使用setTimeout比使其同步更好,你说呢?