Javascript Ajax将onreadystatechange的结果保存在全局变量中
Javascript Ajax save result of onreadystatechange in global variable
我正在尝试编写一个脚本来检索WOEID和与Yahoo Weather API的接口。我正在根据我正在使用的数据库中的东西构建一个基于纬度和经度值的URL,并且可以很好地做到这一点。
然而,当我把URL存储为一个可以在其他函数中使用的字符串时,我遇到了麻烦。经过初步阅读,onreadystatechange和scope似乎是个问题,但我似乎无法理解它,无法存储我的变量。
这是我到目前为止的代码:
//<![CDATA[
var latitude = "";
var longitude = "";
var yahooAppID = "";
var yql = "";
//example yahoo request
//http://where.yahooapis.com/geocode?q=38.898717,+-77.035974&gflags=R&appid=SKUTk24k
function getLatLng() {
var routeID = 5;
var get = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
get.open('POST','process.php', true)
get.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
get.send('command=fetch&rid='+routeID);
get.onreadystatechange = function(){
if(get.readyState==4 && get.status == 200) {
os = eval('(' + get.responseText + ')');
latitude = os.start.lat;
longitude = os.start.lng;
//var yql = 'select * from flickr.places where lat='+latitude+' and lon='+longitude;
yql = "select * from flickr.places where lat=" +latitude+ " and lon="+longitude;
}
document.write(yql);
}
document.write(yql);
}
function test() {
getLatLng();
}
//]]>
第一个document.write(yql);
似乎产生了正确的字符串,但第二个没有,所以我知道这个值没有固定下来。
如果有人能帮忙,请提前感谢。
您关注的不是范围问题,而是时间问题。AJAX请求(至少按照您配置的方式)是异步发生的,因此脚本的其余部分将在加载AJAX请求时执行。所以yql
直到最后才会更新。
此外,警告:在请求完成时,您将无法再使用document.write
。使用alert()
或DOM操作。
生命周期如下:
- 脚本执行正常
- 匿名函数绑定到
onreadystatechange
- readyState从"unsent"变为"headers received",从"loading"变为了"done"。函数每隔调用一次,但只有在就绪状态为"完成"时才设置
yql
- readyState完成,然后生成
yql
所以,只需从if:内部调用您的处理函数
if(get.readyState==4 && get.status == 200) {
os = get.responseXML;
//find lat + lng
yql = "select * from flickr.places where lat=" +latitude+ " and lon="+longitude;
process(yql); //here!
}
function process(yql) {
alert(yql); //do something more useful eventually
}
jsFiddle
相关文章:
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- 如何将getJson的响应保存在全局变量中
- 按下按钮时保存cookie
- 如何使用 Angular JS 将数据保存在数据库中
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- 用于检查数组中是否存在元素的javascript自定义方法
- HTML5在画布中加载较小的图像并保存实际大小的图像
- 是否可以在浏览器中使用纯JavaScript保存音频流
- 如何将多个画布保存为一个图像
- 使用javascript/jquery从现有数组中创建一个新数组,该数组保存项目存在的次数
- jQuery localStorage 如果存在,请保存它
- 如何在移动到新的HTML页面后使用保存在Javascript文件中的保存变量
- 根据页面元素的存在更改文件路径以保存页面内容
- 如何比较保存在变量中的querystring参数,并将变量保存在cookie中,并在每页上进行比较
- 在Json解析和在数据库中保存值方面存在问题
- 将对象替换为保存前已经存在的对象
- 如何在Mongoose中保存之前检查数据库中是否存在嵌入文档