我现在不知所措。我正在使用一个简单的变量,其值在循环期间分配。退出循环后,变量的值仍未定义,除非我首先提醒它的值。一切正常。这是怎么回事?
$(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)发生在此迭代内的回调函数内。所以当我连续尝试访问下面几行代码时,该值可能还没有。我怎么能等待分配值?
答案 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编程!
你需要在回调中放入所有,而不仅仅是变量赋值。