Client端异步Callback实现的原理

原创 2007年09月16日 15:52:00

我已经介绍了Client-Callback技术,那么让我们来探讨一下Client-Callback技术怎样实现异步刷新吧(实现原理)。正所谓"知其然,知其所以然"。

运行前一篇文章的(http://blog.csdn.net/goalbell/archive/2007/09/16/1787213.aspx)例子,用firebug调试并打开查看一下WebResource.axd?d=23ERqfzqTJs6_Rg9n1je_Q2&t=633249794114687500。你会发现里面大有文章,呵呵!微软已经帮你封装好实现异步所需要的技术了,即是XmlHttpRequest对象。从firebug里面的js代码总共有537行,实现的技术大部分围绕XmlHttpRequest对象以及Dom技术。下面分析核心代码(core)的实现过程吧。Let's Start!

下面的一段代码取自WebForm_DoCallback的函数里面:

 var xmlRequest,e;
 try {
  xmlRequest = new XMLHttpRequest();
}
catch(e) {
try {
xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
 }
catch(e) {
}
}
 var setRequestHeaderMethodExists = true;
try {
 setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);
}
catch(e) {}
 var callback = new Object();
callback.eventCallback = eventCallback;
 callback.context = context;
 callback.errorCallback = errorCallback;
callback.async = useAsync;
 var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);
if (!useAsync) {
if (__synchronousCallBackIndex != -1) {
 __pendingCallbacks[__synchronousCallBackIndex] = null;
 }
 __synchronousCallBackIndex = callbackIndex;
 }
 if (setRequestHeaderMethodExists) {
 xmlRequest.onreadystatechange = WebForm_CallbackComplete;
 callback.xmlRequest = xmlRequest;
 xmlRequest.open("POST", theForm.action, true);
 xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlRequest.send(postData);
return;
}

分析一下:

             首先实例化一个兼容三种浏览器(IE、FF、SF)的XmlHttpRequest对象,接着调用javascript内置的Object类来建立一个callback构造函数,该构造函数总共有四个属性。至于Callback构造函数有什么用呢?接下来这一句callback.xmlRequest=xmlRequest可以看到,将XmlHttpRequest的实例赋给了callback的属性了。最后XmlHttpRequest的实例(xmlRequest),即xmlRequest的回调方法onreadystatechange指向了WebForm_CallbackComplete,而WebForm_CallbackComplete这个函数干什么的呢?下面会分析的;xmlRequest向服务器发送请求,theForm.action怎样获得的呢?她是通过WebForm_DoPostBackWithOptions函数来获得的。由于xmlRequest是用"POST"方法向服务器请求的,所以要标明请求的头格式以及发送的参数。好了分析完上面的代码之后,我们一起来看一下WebForm_CallbackComplete究竟做了什么呢?

下面的是完整的函数示例:

function WebForm_CallbackComplete() {
 for (i = 0; i < __pendingCallbacks.length; i++) {
 callbackObject = __pendingCallbacks[i];
 if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {
 WebForm_ExecuteCallback(callbackObject);
 if (!__pendingCallbacks[i].async) {
 __synchronousCallBackIndex = -1;
 }
 __pendingCallbacks[i] = null;
var callbackFrameID = "__CALLBACKFRAME" + i;
var xmlRequestFrame = document.getElementById(callbackFrameID);
if (xmlRequestFrame) {
 xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
 }
 }
 }

我们看一下,_pendingCallbacks怎样来的,var __pendingCallbacks = new Array();原来_pendingCallbacks是一个数组变量来的,其实从循环也可以猜到了。接着就将它赋给一个callback对象了,其实callback对象上面已经实例化了(上面那个callback构造函数)。最后就是判断xmlRequest的状态码来执行WebForm_ExecuteCallback函数。

最后,如果大家有什么好的看法可以反馈给我。

 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android Asynchronous Http Client-Android异步网络请求客户端接口

1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用an...

[转载]异步Socket服务器与客户端(An Asynchronous Socket Server and Client)

(原创翻译文章·转载请注明来源:http://blog.csdn.net/hulihui/archive/2008/11/05/3230503.aspx)   原文:An Asynchro...

ArcGIS Server9.3 AJAX系列(二)Client CallBack解决方案

http://blog.3snews.net/html/22/222-25968.html 之前的文章有提到ArcGIS Server93提供了两种AJAX模式,一种是client callback模...

terracota DSO client App端原理分析

对于terracota项目是什么,google一下资料很多。推荐一篇中文文档,http://yale.iteye.com/blog/1541612 为了说明本文要关注的方向,并借用一张图先。下面的T...

jQuery源码解析(2)—— Callback、Deferred异步编程

闲话这篇文章,一个月前就该出炉了。跳票的原因,是因为好奇标准的promise/A+规范,于是学习了es6的promise,由于兴趣,又完整的学习了《ECMAScript 6入门》。本文目的在于解析jQ...

Callback Hell-Javascript异步编程指导

--先摘录,待翻译。 What is "callback hell"? Asynchronous javascript, or javascript that uses callb...

Android Http异步请求,Callback

之前一直在用HTML5开发移动本地应用,后来发现,实际上HTML5开发的本地应用,开发效率高,而且跨平台,但是体验,相应无法和原生应用,还有一定差距。 开发HTML5和远程交互,采用JSONP,是异...

异步javascript,callback、Promise?我们用Generator!

ES6提供了两个处理异步Js的特性:Promise和Generator。我们这里会介绍这两个新特性,并在最后讲解如何使用Generator。为了使本文更加贴近实际,我们使用一个网络请求库request...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)