V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
lanwairen123
V2EX  ›  JavaScript

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

  •  
  •   lanwairen123 · 2017-07-14 21:25:56 +08:00 · 3108 次点击
    这是一个创建于 2687 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看代码

    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 的变量作用域有关,但是调试一下午也没弄好。请大家帮忙看看吧。

    第 1 条附言  ·  2017-07-14 22:19:35 +08:00
    var getPrecent = function(){ 
    	$.getJSON(Url, requestData, function (rv) { 
    		var response = rv.Value; 
    		ret = response.Process; 
    		if (ret == 100) { 
    			console.log("Done!,已完成100%"); 
    		}else{ 
    			console.log("已完成"+ret+"%");
    			setTimeout(getPrecent,200); 
    		} 
    	}); 
    }; 
    getPrecent();
    

    谢谢,上面的代码可以正常运行了。

    17 条回复    2017-07-25 08:00:34 +08:00
    loy6491
        1
    loy6491  
       2017-07-14 21:39:41 +08:00
    1. 看看请求成功了没
    2. 看看 ret 是 100 么
    3. 不要用同步的 ajax

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

    }else{
    再执行一次 getjson 的 function
    }
    (手机码,不要介意。)
    lanwairen123
        9
    lanwairen123  
    OP
       2017-07-14 21:57:38 +08:00
    @wly19960911 如果可以的话,能给个示范的代码吗,之前学过点 php,遇到 javascript 彻底懵了,各种变量的作用域,各种 undefined ……比如上面代码里面 ret 在回调里面有值,但是到外面又取不到值了,不知道怎么回事。
    tsotsi
        10
    tsotsi  
       2017-07-14 22:01:22 +08:00   ❤️ 2
    ```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
        11
    wly19960911  
       2017-07-14 22:03:49 +08:00 via Android   ❤️ 1
    @lanwairen123 10 楼演示了,手机不好码代码,你把他的格式化下就好,
    lanwairen123
        12
    lanwairen123  
    OP
       2017-07-14 22:12:23 +08:00
    @tsotsi
    @wly19960911
    可以用了,谢谢!看来还得好好学学 javascript:stuck_out_tongue_winking_eye:
    ode
        13
    ode  
       2017-07-14 22:25:25 +08:00 via iPhone   ❤️ 1
    槽点太多 先把基础看了再说 不要以为会 php 就可以直接上手 js 否则会掉进坑里
    lanwairen123
        14
    lanwairen123  
    OP
       2017-07-14 22:36:42 +08:00
    @ode 已经掉坑里了,正在学怎么爬出来……
    LioMore
        15
    LioMore  
       2017-07-15 00:34:21 +08:00
    哈哈哈哈哈哈哈哈哈哈哈
    “不要以为会 php 就可以直接上手”
    赞成
    leopku
        16
    leopku  
       2017-07-15 11:32:41 +08:00
    @ode 哈哈哈
    lavawong
        17
    lavawong  
       2017-07-25 08:00:34 +08:00 via iPhone
    又一个掉坑里的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1172 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 18:11 · PVG 02:11 · LAX 10:11 · JFK 13:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.