一个关于 javascript 的题 求解

2014-08-27 16:37:34 +08:00
 frontman
var p = {
urls: "",
img: ""
};


(function(win) {


var ps = {
hah: function(win) {
$.ajax({
type: "get",
url: "http://m.mvbox.cn/sod?action=28&parameter={'AVID':" + 594941 + "}",
dataType: "jsonp",
jsonp: "callback",
success: function(data) {

p.urls = data.spaceav.userID;
console.log(p.urls );//可以输出结果



}
})
}
}

ps.hah();

alert(p.urls);//不能输出结果




})(window);

alert(p.urls);//不能输出结果


这是为什么
2943 次点击
所在节点    程序员
7 条回复
ttph1oc
2014-08-27 16:40:41 +08:00
AJAX是异步的,alert的时候请求还没完成。
kokdemo
2014-08-27 16:57:01 +08:00
你可以认为ajax的代码实际上是在最后执行的,所以有一些需要在ajax完成才加载的函数最好卸载ajax的success和done里面
kamal
2014-08-27 17:29:32 +08:00
success 不用匿名函数,可能更容易理解。
写一个单独的函数,你想一下,没有调用,就不会执行。
再想一下什么时候调用,就明白了。
cuixiaolu
2014-08-27 17:40:00 +08:00
同步异步的问题,如果在请求的时候,增加上参数 async :true是异步,false是同步
$.ajax({
type: "get",
url: "http://m.mvbox.cn/sod?action=28¶meter={'AVID':" + 594941 + "}",
dataType: "jsonp",
jsonp: "callback",
async: false
success: function(data) {

p.urls = data.spaceav.userID;
console.log(p.urls );//可以输出结果
}
})
console.log(p.urls);//可以输出了~
Tankpt
2014-08-27 18:09:10 +08:00
楼上的说的很明白了。其实呢。就是这个请求什么时候完成你控制不住的,然后你那里直接alert的时候,数据都还没回来,
format
2014-08-27 18:26:00 +08:00
javascript里的event loop造成的。
解决方法:
1. alert放到success回调里

2. ajax请求加个async: false 参数,表示这个请求是同步
lwbjing
2014-08-27 21:45:47 +08:00
请求在生成的时候,就执行输出了,当然弹不出你要的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/130220

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX