Javascript值分配延迟?

时间:2010-07-21 17:25:33

标签: javascript jquery

我现在不知所措。我正在使用一个简单的变量,其值在循环期间分配。退出循环后,变量的值仍未定义,除非我首先提醒它的值。一切正常。这是怎么回事?

$(myarray).each(function(idx, item)
{
     fetchSomethingRemotely( success: function(data) {
           item.someValue = data; });

     // if the following alert is not there, doSomething will never get called
     // and the alert after the else will show item.someValue as undefined.
     alert(item.someValue);

     if (item.someValue != null) { doSomething(item.someValue); }
     else { alert(item.someValue); }

});

修改

好的,所以我现在有了更好的处理方式。值赋值(item.someValue = 123)发生在此迭代内的回调函数内。所以当我连续尝试访问下面几行代码时,该值可能还没有。我怎么能等待分配值?

3 个答案:

答案 0 :(得分:5)

  

我怎么能等待分配值?

答案已在您的代码中。只需将doSomething移动到回调函数中即可。

fetchSomethingRemotely( { success: function(data) {
       item.someValue = data;
       if (item.someValue != null) doSomething(item.someValue);
} });

请注意,在当前项目获得其值之前,这仍将继续到下一个项目。如果必须按顺序执行所有迭代,则可以执行以下操作:

function iterate(index) {
  var item = myarray[index];
  fetchSomethingRemotely( { success: function(data) {
    item.someValue = data;
    if (item.someValue != null) doSomething(item.someValue);
    if (index < myarray.length - 1) iterate(index + 1);
  } });
}

然后你会用iterate(0)启动整个过程。

答案 1 :(得分:2)

您是否记得使用var来定义变量。您确定该变量存在于您正在使用它的范围中。如果您执行for ( var i ...,那么它只会存在于for范围内,而不会存在于{{1}}范围之外。您可以使用Webkit(Chrome,Safari)的开发人员工具通过在问题行上设置断点来调试脚本,然后在右侧列中可以看到相关范围中定义的所有变量。

答案 2 :(得分:1)

  

“我怎么能等待价值   分配?“

欢迎使用asyncronous编程!

你需要在回调中放入所有,而不仅仅是变量赋值。