【问题标题】:Do functions not wait for a finish in execution of line before they go on to the next line [closed]函数在执行下一行之前不要等待行的完成[关闭]
【发布时间】:2011-10-12 19:58:14
【问题描述】:

我习惯于用 python 编程并正在尝试学习 javascript。我希望该应用程序可以在 chrome 上运行,所以不在乎让它跨浏览器。我也想在不使用 jquery 或其他库的情况下编写它——因为我只是在学习 javascript。

我的普遍问题是,函数调用通常看起来像是被“跳过”了。我正在使用萤火虫,在控制台上看不到任何错误。因此,如果我在一个函数中有两个调用,则一个接一个地调用

mydict_user_values = return_dict_of_user_names()
alert("I HAVE USER VALUES " + mydict_user_values.length) 
// This next line gets called sometimes before the previous line so the values in the table filled in by next line are blank even though the dictionary above has the correct length
fill_user_name_values_into_table(mydict_user_values)

我习惯了 python,不明白发生了什么。很抱歉提出一个抽象的问题,但是我没有得到关于 javascript 的一些基本知识。

已编辑:一天 -6 分。我很震惊!我知道我的代码中有一些严重的新手错误:我已经把它放在了所有新手的错误中。

https://github.com/harijay/gridzilla_web

我的典型功能:

function return_dict_of_user_names()
{
   var my_new_dict 
   var my_user_names = document.getElementsByClassName("my_users");
   for (var i = 0; i <= my_user_names.length ; i++){
      var a_num  = document.getElementById("user_number_" + i).value
      var a_name = document.getElementById("user_name_" + i).value
      my_new_dict[i] = [a_num,a_name]
   }
   return my_new_dict
}

然后我有其他 javascript 函数来获取这些值并填充同一页面的另一部分。

function fill_user_names_into_div(mydict){
   var my_username_dict = mydict;
   //Javascript code to fill in the values by lines like
   my_fillable_elements = document.getElementsByClassName("user_table_fancy_entry")
   for (var i = 0 ; i <= my_fillable_elements.length ; i++){
      document.getElementById("usertable_user_number_" + i).value = my_username_dict[1][1]
   }

【问题讨论】:

  • 不,Javascript 语句是同步执行的。你还没有真正向我们展示一个可证明的问题,所以我认为这个问题无法回答。
  • 大家好。关闭它不是那么快。提供的代码中存在 javascript 错误,我们可以帮助他们修复。
  • 感谢 Tomalak 和 jfriend00 的耐心等待。我认为是一个很好的问题已经-3分了。我想即使说“帮助我的代码不起作用”也会得到不那么严厉的反应

标签: javascript function var


【解决方案1】:

Javascript 语句是同步执行的。我认为您有一些可能在某些地方停止执行的 javascript 错误。您应该在 javascript 错误控制台或调试控制台中查看您有 javascript 错误的位置。例如,在这个函数中:

function return_dict_of_user_names()
{
   var my_new_dict 
   var my_user_names = document.getElementsByClassName("my_users");
   for (var i = 0; i <= my_user_names.length ; i++){
      var a_num  = document.getElementById("user_number_" + i).value
      var a_name = document.getElementById("user_name_" + i).value
      my_new_dict[i] = [a_num,a_name]
   }
   return my_new_dict
}

在使用它之前,您必须将 my_new_dict 初始化为一个数组,如下所示:

function return_dict_of_user_names()
{
   var my_new_dict = [];   // initialize to empty array
   var my_user_names = document.getElementsByClassName("my_users");
   for (var i = 0; i < my_user_names.length ; i++) {
      var temp = [];
      temp.push(document.getElementById("user_number_" + i).value);
      temp.push(document.getElementById("user_name_" + i).value);
      my_new_dict.push(temp);
   }
   return my_new_dict;
}

此外,javascript 语句应以分号结尾,我建议使用.push() 将项目添加到数组的末尾。

【讨论】:

  • 我正在使用 firebug 和 chrome 开发者工具 (CTRL+Shift+I)。我在这里提出一个问题的原因是,在花了几个小时编写代码之后,我无法理解为什么 firebug 控制台中没有错误。我的代码中有警告语句,但每次都没有被调用 - 混淆了故障排除。
  • @harijay - 你一定在 Chrome 控制台中遗漏了一些东西,因为当我在这里制作你的代码的工作版本时:jsfiddle.net/jfriend00/Z8Dvm,我看到一个错误 Uncaught TypeError: Cannot set property '0' of undefined,这是因为你没有' t 将 my_new_dict 初始化为一个空数组。一切都在 Chrome 控制台中。
  • 非常感谢 jfriend00。我现在在我的真实代码中看到了一些错误,这些错误都可能是由于在空字典中查找数组元素造成的。我在上面发布了指向我的代码的链接。但你已经是一个很大的帮助。还要感谢指向 jsFiddle 的指针
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2020-05-25
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多