开发者社区> 问答> 正文

JS变量作用域给搞糊涂了,求人解答:报错

var jsFieldLoading = function(fields) {
            var jsStr = "";
            for ( var i = 0; i < fields.length; i++) {
                Ext.Ajax.request( {
                    method : 'POST',
                    url : fields[i].js,
                    success : function(response, option) {
                        jsStr += response.responseText;
                        alert("test1" + jsStr);
                    },
                    failure : function(response, option) {
                        Ext.MessageBox.alert('错误信息提示',
                                '加载页面超时 或 页面连接错误!');
                    }
                });
            }
            alert("test:" + jsStr);
            return jsStr;

        }
这段代码运行在extjs4.02中,很奇怪为什么test1能弹出内容来,而test的却没有任何字符呢?作用域不对吗?或者如何更改呢?

展开
收起
kun坤 2020-06-04 21:07:20 848 0
1 条回答
写回答
取消 提交回答
  • 结贴:这个问题解决了,在Extjs4.0中已经有此属性的配置了,看下面代码: Ext.Ajax.request( {                     method : 'POST',                     url : fields[i].js,                     async : false,//添加该属性即可同步                     success : function(response, option) {                         jsStr += response.responseText;                     },                     failure : function(response, option) {                         Ext.MessageBox.alert('错误信息提示',                                 '加载页面超时 或 页面连接错误!');                     }                 }); ######request是异步的啊 ,跟我当年的困惑一样,折腾了好久才明白……哈哈

    ######

    引用来自“天涯咫尺”的答案

    jquery ajax里面有个参数asycn 默认是true 代表异步,你把它设置成false时,就可用用了。 ext里面应该也有,因为这是ajax的一个参数。
    asycn 表示的意思是单个ajax请求的时候 是否为异步, 如果设置为false, 则要等到服务器返回才会继续往下执行代码, 也就是你的页面就卡那, 直到服务器返回. 对于多个ajax之间的同步没有用处. 设置为false后, 每发送一个请求就卡住, 直到他返回, 每次返回都会触发success或failure, 而不是同步所有的ajax都完成之后, 只触发一次success或failure. ######你说的完全对,不过ajax的同步有时也是有用的。必须说在等待后台返回的数据,然后判断进行操作,最后返回TRUE或者FALSE的时候,必须要用ajax的同步了,或者能提供一个别的思路######

    引用来自“szmneo”的答案

    request是异步的啊 ,跟我当年的困惑一样,折腾了好久才明白……哈哈
    我也发现这个问题了,可是如何解决呢? 真是头疼 ######难道你知道原因了还搞不定ext的同步请求吗?extjs3.2是要自己另加插件的,叫ext-basex.js,然后代码里Ext.Ajax.request里就可以用async : false来控制,4.0我还没开始用呢,不知道内置async了没,自己查看源码吧######

    引用来自“Panaon”的答案

    引用来自“szmneo”的答案

    request是异步的啊 ,跟我当年的困惑一样,折腾了好久才明白……哈哈
    我也发现这个问题了,可是如何解决呢? 真是头疼
    那就在ajax的回调函数里面alert呗,或者在回调函数里面调用一个函数,这个函数做alert. ######ajax应该有支持同步的吧,看看是否有同步的参数,jquery是支持的###### jsStr变量在function里面赋的值,以上那种情况外面的jsStr肯定是没有值的。######楼主, 你的意图没有说明白, 你是希望在所有的返回字符串全部链接完毕后再弹出对话框吗? 如果是这样, 你应该使用回调, 而不是return返回结果. 因此必须有一个外部的甚至是全局的变量用来存储返回的值, 并在回调中进行计数, 当全部响应后, 即计数等于循环最大值后, 才调用弹出.  var res= {sum:0,ary:[]};//make sure accessible in your scope var handleFn = function(success, msg, max){     if (success) res.ary.push(msg);    if (max == ++res.sum) alert(res.ary.join(''));//all responsed, call your function back } 在ajax的success方法中改为 handleFn(true, response.responseText, fields.length); 同理,在failure方法中改为 handleFn(false, response.responseText, fields.length); 当所有的请求全部响应时, 才调用你定义的方法, 此处是alert. ######和 extjs 没啥关系 去掉 extjs 代码 , 剩下 var jsFieldLoading = function(fields) {                 var jsStr = "";                                 alert("test:" + jsStr);                 return jsStr;                   } jsFieldLoading只是一个变量, 当然不会 alert , 如果想 alert , 加一个括号就行了。   var jsFieldLoading = function(fields) {                 var jsStr = "";                                 alert("test:" + jsStr);                 return jsStr;                   }();    ######你这真会误导 人……######

    引用来自“scl33”的答案

    楼主, 你的意图没有说明白, 你是希望在所有的返回字符串全部链接完毕后再弹出对话框吗? 如果是这样, 你应该使用回调, 而不是return返回结果. 因此必须有一个外部的甚至是全局的变量用来存储返回的值, 并在回调中进行计数, 当全部响应后, 即计数等于循环最大值后, 才调用弹出.  var res= {sum:0,ary:[]};//make sure  accessible in your scope var handleFn = function(success, msg, max){     if (success) res.ary.push(msg);    if (max == ++res.sum) alert(res.ary.join(''));//all responsed, call your function back } 在ajax的success方法中改为 handleFn(true, response.responseText, fields.length); 同理,在failure方法中改为 handleFn(false, response.responseText, fields.length); 当所有的请求全部响应时, 才调用你定义的方法, 此处是alert.
    这个功能主要响应EXTJS treepanel点击事件,加载指定URL的页面,因为用到了tabPanel所以对于使用全局变量不合适,而对于在success后执行自定义方法,并不能确定我调用jsFieldLoading方法是返回的是有效的值,现在问题困在如何返回AJAX请求到的文件内容,对于Extjs4.0里没有找到Ext.Ajax的同步设置属性,我现在想不出更好的方案解决它。
    2020-06-08 10:57:40
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript异步编程 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载