JS 异步按需载入和异步编程总结
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- 授权: 共同创作2.0
- 作者: trydofor
本文使用了[[a9text => http://a9text.sf.net]]格式.
目标读者为,有一定js基础,并对异步按需载入有需求的人群.
0. 目录
^^^^^^^
[[<=$INDEX]]
1. 为什么异步按需载入
^^^^^^^^^^^^^^^^^^^^^
在web应用上,经常会根据需要来载入不同的JS/CSS/TEXT/HTML等.
在粗放型web开发,被用户体验取代的今天,按需载入也被用来榨干代码中的油水.
之所以我过多的关注按需载入,是因为sourceforge.net的访问速度有点可怜.
而且我一直努力的a9text有太多的area需要实时载入parser和render.
开发和本地使用,使用了XMLHttpRequest同步,但web应用中同步就等于死机
曾经和JSI的金大卫调侃说:知道浏览器厂商,啥时候能改善同步的体验不?
异步按需载入迫在眉睫,但JSI又不适合a9text.
JSI的着眼点在于已知,而a9text在于运行时和线程功能.
尽管老金告诉我JSI2.0瘦身版才5k,代码才500行.
无奈,只能自力更生 ...
2. 如何异步按需载入和异步编程
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
js不支持线程功能,更不用指望sleep和wait等功能.异步编程的不可预测性在js上徒增.
(http://www.neilmix.com/narrativejs/doc/设想不错,大家可以学习下)
挣扎过程中,考虑过timeout和interval,但不是最佳,也不是有效的方法.
解铃还得系令人,着眼点还得回到XMLHttpRequest的使用上来.
为此,a9text废除了a9engine,写了个专一的a9loader,用来提供异步开发的模式.
首先亮相的是a9loader提供了以下2个异步载入和编程的方法.
...........................................................
void A9Loader.asyncImportClass(String clzz)
async import an js and export like java
@param clzz (String) eg:'com.trydofor.a9text.parser.a9text'
void A9Loader.runAfterImport(Function func)
run the func when all class imported
@param func (Function)
...........................................................
asyncImportClass 用来 异步载入/初始化/包隔离/公共化 一个js类
runAfterImport 用来执行所有等待import完毕后的方法.
================== js : example ========================
A9Loader.asyncImportClass('com.trydofor.a9text.parser.a9text');
A9Loader.asyncImportClass('com.trydofor.a9text.render.html.a9text');
A9Loader.runAfterImport(function(){
for(var i=0; i<a9PreText.length;i++){
var a9dom = new A9Dom(null,A9Dom.type.root); //com.trydofor.a9text.A9Dom
a9dom.setText(a9PreText[i]);
a9dom.putInfo(A9Dom.type.root$path,A9Loader.getPagePath());
a9DomHtml[a9dom.getId()] = a9PreHtml[i];
new A9TextParser().parse(a9dom,function(){
new A9TextRender().render(a9dom,function(){
var a9htm = a9dom.getData();
var preHtml = a9DomHtml[a9dom.getId()];
var prePos = bodyHtml.indexOf(preHtml);
var headPos = bodyHtml.lastIndexOf('<',prePos);
var footPos = bodyHtml.indexOf('>',prePos+preHtml.length)+1;
bodyHtml = bodyHtml.substring(0,headPos) + a9htm + bodyHtml.substr(footPos);
if(document.body) document.body.innerHTML="";
document.write(bodyHtml);
document.close();
});
});
}
});
========================================================
上面的代码中,runAfterImport中还间接的调用了runAfterImport.
但结果都是缓存在一个队列中,等待import结束后顺序执行.
实现手法是这样的:
有一个task队列,里面有引用计数和几个队列.
发送一个async request的时候,计数加1,callback的时候,计数减1
同时呼叫一个检查计数的方法.
当最后一个callback执行时,计数等于0,于是开始处理各种队列.
3. 应用范围与不足
^^^^^^^^^^^^^^^^^
本应用属于另类,仅在特殊场合应用或学习使用,
一般的web开发,最好使用script tag或通常的ajax手法.
因为没有使用timeout和interval,框架完全基于一个基本假设,
就是所有async请求都能正常返回,如果其中有一个出现问题,
runAfterImport中排队的方法将永远不被执行.
其中的危险,主要来自浏览器的缓存,网络条件.
异步JS开发,请尽量回避.
希望a9loader和本文对需要的人有帮助.
分享到:
相关推荐
这个过程通常涉及到JavaScript编程,特别是与事件处理、动画效果和DOM操作相关的技术。 JavaScript是一种广泛使用的客户端脚本语言,它允许开发者在用户的浏览器上运行代码,从而实现交互性功能。在"js等待提示"中...
2. **动态内容加载**:在jQuery中,动态加载内容通常涉及Ajax(异步JavaScript和XML)技术。使用`$.ajax()`, `$.get()`, 或 `$.post()` 方法,可以向服务器发送请求并在不刷新整个页面的情况下获取和插入新数据。 3...
在JavaScript编程中,动态插入脚本是一种常见的技术,用于在页面加载后或者根据某些条件按需加载外部的JavaScript文件。这种技术在处理大型应用、优化页面性能或实现异步加载时非常有用。本文将详细介绍如何让动态...
总的来说,Ajax页面载入的等待特效是提高用户体验的重要手段,通过巧妙的设计和编程技巧,我们可以创造出各种吸引人的加载效果,使得用户在等待过程中不会感到不耐烦,从而提升整体的网站或应用的品质。
JavaScript(简称JS)是一种广泛用于前端开发的编程语言,它在构建交互式网页和处理数据方面扮演着重要角色。在本资源包中,你将找到二十多种不同的JS目录树实现,这些实现涵盖了各种功能和样式,可以满足不同场景下...
本WebBrowser编程技术包括Delphi、C#、VC++、VB等编程资料的集合,其中的 实例大多以Delphi为示例讲解,Delphi7 IDE开发环境。 IE_WebBrowser编程技巧 修改WebBrowser的header信息? Delphi查看...
XML(Extensible Markup Language)是一种...总结来说,XML外部载入图片涉及XML解析、URL处理、图片显示以及可能的样式和布局管理等多个步骤。通过理解这些知识点,开发者可以构建出能够灵活处理图像数据的应用程序。
1. **载入优化**:API的载入方式有所改变,现在可以通过异步方式加载,提高了页面响应速度。 2. **简化API引用**:新的API URL简化了引用,减少了出错的可能性。 3. **移除旧版API**:谷歌逐步停止对旧版本的支持,...
SmartClient框架采用模块化结构,这使得代码组织清晰,便于维护和按需加载。文件名称列表中的"modules"可能包含了不同功能的模块,如UI组件、数据管理、事件处理等。开发者可以根据项目需求选择加载必要的模块,...
7.1.2 JavaScript和XMLHttpRequest对象 7.1.3 XML 7.1.4 一个可重用的对象 7.1.5 Ajax是正确的选择吗 7.2 为什么Ajax会破坏网站及如何解决 7.2.1 依赖JavaScript生成内容 7.2.2 ...
JQuery是一个轻量级的JavaScript函数库,能够让开发者在网页上快速简单地操作HTML文档添加动画和进行Ajax异步交互,从而提高开发者的编程效率。 在设计静态网页效果时,采用隐藏显示方法实现滑动门效果,采用计时...
JavaScript作为一种客户端的编程语言,能够在用户与网页交互时实时更新内容,无需刷新整个页面。 在描述中提到的"采用淡入淡出的方式变换图片",这是一种常见的动画效果,通过控制图片的透明度变化,使新旧图片之间...
本文将深入探讨“常用的页面载入提示效果特效代码”,介绍如何通过编程技术提升网页加载过程中的视觉体验。 一、页面载入提示的重要性 在网页加载过程中,用户可能会遇到等待时间较长的情况,此时一个富有创意且...
AJAX的核心是JavaScript对象XMLHttpRequest,该对象是一种支持异步请求的技术,用户可以使用该对象向服务器提出请求并处理响应,并且还不会影响客户端的信息通信。 ;ASP.NET3.5 和AJAX ASP.NET 3.5之前,ASP.NET自身...
它结合了JavaScript技术、XML、 DOM 等编程技术,可以使得客户端和服务器端交换数据的响应更实时,而不需要每次都重新载入整个页面。 AJAX的工作原理是将JavaScript、XML、DOM等技术组合起来,共同协作发挥各自的...
7.1.2 JavaScript和XMLHttpRequest对象 7.1.3 XML 7.1.4 一个可重用的对象 7.1.5 Ajax是正确的选择吗 7.2 为什么Ajax会破坏网站及如何解决 7.2.1 依赖JavaScript生成内容 7.2.2 ...
7.1.2 JavaScript和XMLHttpRequest对象 7.1.3 XML 7.1.4 一个可重用的对象 7.1.5 Ajax是正确的选择吗 7.2 为什么Ajax会破坏网站及如何解决 7.2.1 依赖JavaScript生成内容 7.2.2 ...
在JavaScript中,Ajax(Asynchronous ...总的来说,理解和掌握如何创建Ajax对象、建立服务器连接、发送请求以及监控请求状态,是进行Ajax编程的基础。通过这些知识点,开发者可以构建出高效、交互性强的Web应用。
Spring 提供了一个全面的编程和配置模型,对服务层的支持包括事务管理、数据访问集成等。它推崇 DI(依赖注入)和 AOP(面向切面编程),并提供了丰富的 MVC(模型-视图-控制器)框架。Spring 还支持多种持久层技术...
这个项目涉及到的主要技术是JavaScript(js)和Web前端开发,通过创建一个交互式的商品分类系统,使得用户能够方便地浏览和筛选商品。 首先,"商品分类"是电商网站的核心功能之一,它允许用户按照不同的属性(如...