求救,关于 js 变量作用域的问题,纠结一下午了。

2017-07-14 21:25:56 +08:00
 lanwairen123

看代码

var bool = true;
while(bool){
	var ret='';
	$.ajaxSettings.async = false;
	$.getJSON(Url, requestData, function (rv) {
		var response = rv.Value;
		ret = response.Process;
		if (ret == 100) {
			console.log("Done!");
			bool = false;
		}
	});
	console.log('已完成:'+ret+'%!');
	$.ajaxSettings.async = true;
}

在写一个小 js 脚本,通过 while 循环使用$.getJSON 获取一个连接的返回值,通过判断返回值里面的一个值来控制 while 循环退出,但是总是死循环卡死,折腾一下午了,查资料说是和 javascript 的变量作用域有关,但是调试一下午也没弄好。请大家帮忙看看吧。

3136 次点击
所在节点    JavaScript
17 条回复
loy6491
2017-07-14 21:39:41 +08:00
1. 看看请求成功了没
2. 看看 ret 是 100 么
3. 不要用同步的 ajax

这也能调一下午
boogiefer
2017-07-14 21:42:42 +08:00
while 必须 写到回调里去
sunsai
2017-07-14 21:43:13 +08:00
while 循环是同步的,getjson 是异步的,而且 js 是单线程的,这样就会一直 while 循环,都没有机会执行回调,也就无法退出循环了
sunsai
2017-07-14 21:44:39 +08:00
我的错了
lanwairen123
2017-07-14 21:46:36 +08:00
@loy6491 1.network 里面确定请求成功,有返回值;
2.ret 在回调里面确定是 100 ;
3.如果不用同步 ajax,获取不到 ret。
4.ret 在回调外部没有值,不知道什么情况。
新手,见笑了。
lanwairen123
2017-07-14 21:47:41 +08:00
@boogiefer while 循环需要在外面,因为要不断调用 getjson 获取返回值。
lanwairen123
2017-07-14 21:48:14 +08:00
@sunsai $.ajaxSettings.async = false; 设置成同步模式了。
wly19960911
2017-07-14 21:50:14 +08:00
打断点不能出来?
另外采取二楼意见,把 while 循环调用改成递归回调
if ( ret ==100 ){

}else{
再执行一次 getjson 的 function
}
(手机码,不要介意。)
lanwairen123
2017-07-14 21:57:38 +08:00
@wly19960911 如果可以的话,能给个示范的代码吗,之前学过点 php,遇到 javascript 彻底懵了,各种变量的作用域,各种 undefined ……比如上面代码里面 ret 在回调里面有值,但是到外面又取不到值了,不知道怎么回事。
tsotsi
2017-07-14 22:01:22 +08:00
```javascript
var bool = true;
var ret='';
$.ajaxSettings.async = false;
while(bool){
$.getJSON(Url, requestData, function (rv) {
var response = rv.Value;
ret = response.Process;
if (ret == 100) {
console.log("Done!");
bool = false;
}
});
}
console.log('已完成:'+ret+'%!');
$.ajaxSettings.async = true;



;!function(){
var doneCallback = function(){console.log('已完成:100%!');};
var getPrecent = function(){
$.getJSON(Url, requestData, function (rv) {
var response = rv.Value;
ret = response.Process;
if (ret == 100) {
console.log("Done!");
doneCallback();
}else{
setTimeout(getPrecent,200);
}
});
};

}();


```
wly19960911
2017-07-14 22:03:49 +08:00
@lanwairen123 10 楼演示了,手机不好码代码,你把他的格式化下就好,
lanwairen123
2017-07-14 22:12:23 +08:00
@tsotsi
@wly19960911
可以用了,谢谢!看来还得好好学学 javascript:stuck_out_tongue_winking_eye:
ode
2017-07-14 22:25:25 +08:00
槽点太多 先把基础看了再说 不要以为会 php 就可以直接上手 js 否则会掉进坑里
lanwairen123
2017-07-14 22:36:42 +08:00
@ode 已经掉坑里了,正在学怎么爬出来……
LioMore
2017-07-15 00:34:21 +08:00
哈哈哈哈哈哈哈哈哈哈哈
“不要以为会 php 就可以直接上手”
赞成
leopku
2017-07-15 11:32:41 +08:00
@ode 哈哈哈
lavawong
2017-07-25 08:00:34 +08:00
又一个掉坑里的

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

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

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

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

© 2021 V2EX