Ext3.4 Ext.Ajax.request 的同步与异步

1、问题的引出:  在实现动态生成grid表头的需求时,需要用ajax进行同步请求,async:false参数却死活不起作用,google了好半天才发现原来ext3.x本不支持ajax的同步请求,瞬间凌乱。ext4就开始支持了。

2、ext3.4 Ext.Ajax.request的源码解读:

    其实作为一个小菜,我还不是很会阅读源码,只是能看个大概。

2.1  确认项目使用的ext版本

     在引用js的jsp页面上找引用的js文件,如果出现类似于".../ext3.4/../*.js"的东西,恭喜你,不用继续了;

     否则,找“<%@ page import="com.www.uiframe.util.UiframeUtil"%>”貌似是引用框架通用东东的语句,一般UiframeUtil.java里会有对当前页面需要引用的js文件的处理,找到为止。

2.2   找到ext3.4目录下的ext-base.js文件,

       某行处有代码如下:

       Ext.lib.Ajax = function(){ ......}

       ........

        return  asyncRequest(method || options.method || "POST", uri, cb, data);

      ............

        function asyncRequest(method, uri, callback, postData) { ......  }

     

        以上可以看出,文件中只有asyncRequest函数的定义和调用, 而没有出现syncRequest函数的定义和调用,一切都已明了,这就是为什么ext3.4 Ext.Ajax.Request只能进行Ajax的异步请求。

3、如何在ext3.4 中使用ajax进行同步请求呢?

     这个是在网上google来的,文章出处:http://reason2003.blog.163.com/blog/static/1164994692009103012317465/

      现将全文粘贴如下:

------------------------------------------------------   引用文章原文   the  beginning   --------------------------------------

Ext.Ajax.request在2.x是异步请求的,这样话在当前请求没有完成之前就不能在它的外部使用它的返回值,在下面这个表单验证中如果不是同步请求的话就有问题了,如:

var text = new Ext.form.TextField({
 fieldLabel : '名称',
 height : 23,
 width : 400,
 id : 'flowName',
 name : 'flowName',
 allowBlank : false,
 blankText : '名称不能为空',
 validateOnBlur : true,
 validationEvent : true,
 validator : function() {
  var resultValue;
  Ext.Ajax.request({
   url : '',
   sync:true,
   params : {
      name : text.getValue()
   },
   success : function(response, options) {
        var responseArray = Ext.util.JSON.decode(response.responseText);
        resultValue=responseArray.resultValue;
   }
  });
  if (resultValue!=null && resultValue!="") {
      text.invalidText = "该名称己经存在,请重新输入!";
   return false;
  } else {
   return true;
  }
 },
 anchor : '95%'
});

 

上面是通过修改ext-base.js中的Ext.lib.Ajax.request来实现同步请求:

     /**
Adding a synchronous request to the Ext asynchronous only mode of operation.

History: coded from Ext 2.2.

Additional configs.

@param {Object} options
@config {Mixed} [sync] include this for a synchronous request
*/
Ext.lib.Ajax.request = function(method, uri, cb, data, options) {
    if(options){
        var hs = options.headers;
        if(hs){
            for(var h in hs){
                if(hs.hasOwnProperty(h)){
                    this.initHeader(h, hs[h], false);
                }
            }
        }
        if(options.xmlData){
            if (!hs || !hs['Content-Type']){
                this.initHeader('Content-Type', 'text/xml', false);
            }
            method = (method ? method : (options.method ? options.method : 'POST'));
            data = options.xmlData;
        }else if(options.jsonData){
            if (!hs || !hs['Content-Type']){
                this.initHeader('Content-Type', 'application/json', false);
            }
            method = (method ? method : (options.method ? options.method : 'POST'));
            data = typeof options.jsonData == 'object' ? Ext.encode(options.jsonData) : options.jsonData;
        }
    }

    return this["sync" in options ? "syncRequest" : "asyncRequest"](method, uri, cb, data););//这句制定调用的方法,如果sync传递了就调用syncRequest, 否则调用原来的方法asyncRequest};

};

把下面这个方法加上,直接加在asyncRequest方法后面就可以,形式和asyncRequest相同,调用时如果需要同步调用加上sync:true,属性即可

/**
Synchronous request. 
 
@param {Object} method
@param {Object} uri
@param {Object} callback
@param {Object} postData
*/
Ext.lib.Ajax.syncRequest = function(method, uri, callback, postData)
{
    var o = this.getConnectionObject();

    if (!o) {
        return null;
    }
    else {
        o.conn.open(method, uri, false);

        if (this.useDefaultXhrHeader) {
            if (!this.defaultHeaders['X-Requested-With']) {
                this.initHeader('X-Requested-With', this.defaultXhrHeader, true);
            }
        }

        if(postData && this.useDefaultHeader && (!this.hasHeaders || !this.headers['Content-Type'])){
            this.initHeader('Content-Type', this.defaultPostHeader);
        }

        if (this.hasDefaultHeaders || this.hasHeaders) {
            this.setHeader(o);
        }

        o.conn.send(postData || null);
        this.handleTransactionResponse(o, callback);
        return o;
    }
};

但是在ext3.0的源码中已经找不到Ext.lib.Ajax.syncRequest方法。

所以在ext3.0中可以这样实现同步做:

    var obj;

    var value;
    if (window.ActiveXObject) {
        obj = new ActiveXObject('Microsoft.XMLHTTP');
    } else if (window.XMLHttpRequest) {
        obj = new XMLHttpRequest();
    }
    var url = '../../servlet/TestServlet‘;

   obj.open('GET', url, false);
    obj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    obj.send(null);
    value = obj.responseText;


------------------------------------------------------   引用文章原文   the  end               --------------------------------------

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值