在ajax回调函数之外使用变量
在回调函数之外使用全局变量的最佳方法是什么?
var icon; $(function(){ $.get('data.xml', function(xml){ icon = xml.documentElement.getElementsByTagName("icon"); //this outputs a value console.log(icon); }); //this is null //How can this maintain the value set above? console.log(icon); });
您提供的代码完全有效 – 事实上, icon
确实 “维持”它的价值。 问题很可能是get()
以异步方式运行 – 只有在 'data.xml'
从服务器上完全加载后才调用匿名函数。 所以现实世界的执行顺序看起来像这样:
- call
get('data.xml', function(xml){...})
(开始加载data.xml) - call
console.log(icon)
(此时icon
仍然为null) - (data.xml完成加载) 现在调用匿名函数,它将值赋给icon:
icon = xml.documentElement.getElementsByTagName("icon")
。
如果你想用icon
的值做一些事情, 在获取’data.xml’之后,你需要在匿名回调函数中进行。 像这样:
var icon; $(function(){ $.get('data.xml', function(xml){ icon = xml.documentElement.getElementsByTagName("icon"); console.log(icon); }); });
祝好运!
注意:您仍然可以使用匿名函数之外的代码中的icon
,但是您需要等待访问它,直到运行匿名函数之后 。 执行此操作的最佳方法是将依赖代码放入其自己的函数中,然后在回调函数中调用该函数:
var icon; $(function(){ $.get('data.xml', function(xml){ icon = xml.documentElement.getElementsByTagName("icon"); loadIcon(); }); function loadIcon() { console.log(icon); // ... do whatever you need to do with icon here } });
console.log(icon);
因为你正在做异步ajax,所以在这一点上没有值。 移动处理回调函数中响应的整个代码或调用它的函数。
$(function(){ $.get('data.xml', function(xml) { var icon = xml.documentElement.getElementsByTagName("icon"); console.log(icon); }); });
问题是$.get
正在排队请求,但不会同步执行请求; 它会立即返回。 JavaScript不是multithreading的!
您必须在回调函数中执行console.log(icon)
。 在执行该行时,AJAX调用尚未完成。
全局icon
变量将从回调中设置; 你的代码在这方面是正确的。
它可以帮助像这样可视化代码。
var icon; $(function(){ $.get('data.xml', callback); // sends ajax request // next line happens immediately unless ajax request is set to synchronous console.log(icon); // logs undefined }); function callback(xml){ // onsuccess callback happens icon = xml.documentElement.getElementsByTagName("icon"); console.log(icon); // logs Array }
我删除了匿名函数并在console.log
之后放置了回调。 像其他人一样指出ajax回调是异步发生的,而javascript继续执行。