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