web前端|js教程
异步编程
web前端-js教程
就好像排队,前面的人忙着忙着突然上厕所了,后面的人阻塞在这里,因此我们就需要让前面的人死到一边去,让后面的人跟进……AJAX就是这个概念,请求还在继续,但我们还可以做其他事。
wav音量增大源码,vscode如何加背景图,ubuntu文件登录,打不开tomcat欢迎,网络爬虫联盟,php手册全集下载,浙江seo优化哪家公司好lzw
javascript中实现这个功能的是来自BOM的一个函数setTimeout,但相关的DOM操作也提供了一系列实现。如XMLHttpRequest对象与script标签的onreadystatechange回调,image的onload与onerror回调,iframe的onload,DOM元素的事件回调,HTML5的跨域消息传送postMessage,QuickTime与flash对象的加载……
火车票预订源码,vscode如何全黑,ubuntu查看gtk,查询tomcat是否配置,爬虫树蛙,php 无级分类,口碑好seo优化需求,在线知识社区网站模板下载,js免费网站模板下载地址lzw
setTimeout的零秒延迟在前些年时间被国内宣扬得特别厉害,但setTimeout是所有延迟中最慢的,最少要花上10多毫秒,如果用setTimeout来开发特效,这特效会运行得比较慢。下面是一个性能测试:
cms源码及数据库,vscode规范,ubuntu omnet,tomcat计算,sqlite 索引 速度,服务器申请表,tab插件代码,前端采用什么框架,php 图片 爬虫,新浪php空间,招聘谷歌seo,框架网站模板,网页 选项卡如何做,html div模板,h5页面向上滑动,小型企业管理系统,二手房门户程序lzw
setTimeout (slow, takes about 10 sec)
function async(callback) { setTimeout(callback, 0); }
img.onerror (data:uri)
function async(callback) { var img = new Image; img.addEventListener(error, callback, false); img.src = data:,foo; }
script.onreadystatechange
function async(callback) { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "javascript:"; script.onreadystatechange = function () { document.body.removeChild(script); callback(); } document.body.appendChild(script); }
script.onload (data:uri)
function async(callback) { var script = document.createElement(script); script.onload = function() { document.body.removeChild(script); callback(); } script.src = data:text/javascript,; document.body.appendChild(script); }
xhr.onreadystatechange (data:text/plain,foo)
function async(callback) { var xhr = new XMLHttpRequest; xhr.open(GET,data:text/plain,foo,true); xhr.onreadystatechange = function() { xhr.onreadystatechange = null; callback(); }; xhr.send(null); }
self.postMessage
function async(callback) { var n = ++async.count; window.addEventListener(message,function(e){ if (e.data == n) { window.removeEventListener(message, arguments.callee,false); callback(); } },false); window.postMessage(n, location.protocol + "//" + location.host); } async.count = 0;
function runtest(div) { var pre = div.getElementsByTagName(‘pre’)[0]; eval(pre.textContent || pre.innerText); // load async function var p = div.getElementsByTagName(‘p’)[0];
var t = new Date, n = 1000, i = 0, flag = true; try { test(); } catch (e) {} setTimeout(function() {if (flag) p.innerHTML = ‘failed’; flag = false}, 200);
function test() { if (i++ < n) { async(test); if (flag && i == 2) { p.innerHTML = unning; flag = false; } } else { p.innerHTML = "Average delay was " + (new Date – t)/n + "ms, over " + n + " iterations."; } } }
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
为了处理这种异步调用,Mochikit从Python的Twisted框架借来了Deferred这个类,并用它来处理AJAX的回调。AJAX的回调通常有两种,成功加载时的回调与请求失败的回调,IE8的XDomainRequest就有这两种回调了,标准浏览器的script与image也有这两种回调,分别称之为onload与onerror。Mochikit的Deferred实例就内置一个数组,每次包含这两种回调,依次执行。Mochikit这伟大的遗产后来由dojo发扬光大了,至于怎么用,自己google吧。
下面是我的框架对它的应用,我已把它整合到我的框架中:
dom.ready(function(){
dom.require("ajax");
dom.ajax({method:"post",
async:true,
dataType:"text",
data:{authenticity_token:window._token}
}).next(function(a){
alert(a)
});
dom.jsonp({url:"http://del.icio.us/feeds/json/fans/stomita"}).next(function(json){
alert(json)
}).error(function(e){
alert(e)
});
});
后台:
class HomeController < ApplicationController
def index
if request.xhr?
name = params[:name]
puts "-------------"
render :text => "
The time is " + DateTime.now.to_s + "
"
end
end
end
在日本一博客提到这样一个捕捉异步错误的例子:
function throwError(){
throw new Error(ERROR);
}
try{
setTimeout(throwError, 3000);
} catch(e){
alert(e);
}
看来try…catch是无法捕捉这种形式的错误,window.onerror可以,但好像只有IE与FF支持。如果用Deferred来处理,就简单了!
dom.Deferred.next(function () {
throw new Error("错误")
}).wait(1).error(function(e){
alert(e instanceof Error)
});
列队处理。由于是使用了异步,因此不会阻塞页面的演染。
dom.require("query");
dom.ready(function(){
var a = dom("#aaa")[0];
dom.Deferred.loop(10,function(i){
a.innerHTML += i+"
"
});
dom.Deferred.loop(10,function(i){
a.innerHTML += String.fromCharCode(i+97)+"
"
});
dom.Deferred.loop(10,function(i){
a.innerHTML += "司徒正美"+i+"
"
});
});
/*结果
0
a
司徒正美0
1
司徒正美1
2
c
司徒正美2
3
d
司徒正美3
4
e
司徒正美4
5
f
司徒正美5
6
g
司徒正美6
7
h
司徒正美7
8
i
司徒正美8
9
j
司徒正美9
*/