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和本文对需要的人有帮助.
分享到:
相关推荐
- **AJAX**:异步JavaScript和XML技术,允许浏览器与服务器之间进行异步通信。 - **ASP**:一种服务器端脚本环境,可以用来创建和运行动态的交互式Web服务器应用程序。 - **JavaScript**:一种常用的编程语言,用于...
在本实例分析中,我们将详细探讨如何使用回调函数实现JavaScript异步脚本载入,包括相关的定义、实现方法和使用技巧。 首先,回调函数是JavaScript中的一个核心概念,它允许开发者将代码块作为参数传递给其他函数,...
这个过程通常涉及到JavaScript编程,特别是与事件处理、动画效果和DOM操作相关的技术。 JavaScript是一种广泛使用的客户端脚本语言,它允许开发者在用户的浏览器上运行代码,从而实现交互性功能。在"js等待提示"中...
在Web开发领域,Three.js是一个非常流行的JavaScript库,它用于创建和展示3D图形,而无需复杂的编程。Three.js利用WebGL技术,这是一种基于OpenGL标准的JavaScript API,可以在浏览器上实现硬件加速的3D渲染。本篇...
2. **动态内容加载**:在jQuery中,动态加载内容通常涉及Ajax(异步JavaScript和XML)技术。使用`$.ajax()`, `$.get()`, 或 `$.post()` 方法,可以向服务器发送请求并在不刷新整个页面的情况下获取和插入新数据。 3...
4. **异步编程**:JavaScript中的回调函数、Promise和async/await用于解决异步操作,避免回调地狱,提高代码可读性。 5. **闭包**:JavaScript中的闭包可以捕获外部作用域的变量,常用于封装私有变量和方法。 6. **...
在JavaScript编程中,动态插入脚本是一种常见的技术,用于在页面加载后或者根据某些条件按需加载外部的JavaScript文件。这种技术在处理大型应用、优化页面性能或实现异步加载时非常有用。本文将详细介绍如何让动态...
总的来说,Ajax页面载入的等待特效是提高用户体验的重要手段,通过巧妙的设计和编程技巧,我们可以创造出各种吸引人的加载效果,使得用户在等待过程中不会感到不耐烦,从而提升整体的网站或应用的品质。
JavaScript(简称JS)是一种广泛应用于网页和服务器端开发的编程语言。它是一种轻量级、解释型、基于原型的语言,具有强大的动态性和灵活性。下面将详细介绍JS基础知识以及面试中常见的考点。 标题所提到的“原型”...
这一步通常涉及到JavaScript的异步模块加载,以及对WebAssembly模块实例的创建和调用。 在工程化环境部署方面,使用现代集成开发环境(IDE)如Visual Studio 2015,可以简化代码调试和工程构建过程。通过集成...
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组件、数据管理、事件处理等。开发者可以根据项目需求选择加载必要的模块,...
第二版书中对 Node.js 中的异步编程模式、模块化和可重用性进行了深入探讨。Node.js 使用事件驱动、非阻塞 I/O 模型,这一模型使得它成为构建数据密集型实时应用的理想选择。Node.js 的标准库极其精简,许多功能需要...
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作为一种客户端的编程语言,能够在用户与网页交互时实时更新内容,无需刷新整个页面。 在描述中提到的"采用淡入淡出的方式变换图片",这是一种常见的动画效果,通过控制图片的透明度变化,使新旧图片之间...