Ext.Ajax.request同步请求 非ext-basex.js方法

前端之家收集整理的这篇文章主要介绍了Ext.Ajax.request同步请求 非ext-basex.js方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在一个程序中需要Ext.Ajax.request同步请求,网上大多是使用ext-basex.js,但是我使用确实无法正常同步调用。所以查找到了其它方法,在此贴出,希望遇到与我同样问题的人可以有所借鉴:

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,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,callback,postData)
{
var o = this.getConnectionObject();

if (!o) {
return null;
}
else {
o.conn.open(method,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; 原文链接:https://www.f2er.com/ajax/166175.html

猜你在找的Ajax相关文章