900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > javascript异步编程【javascript】

javascript异步编程【javascript】

时间:2022-11-07 15:46:28

相关推荐

javascript异步编程【javascript】

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

Async performance testpre { background-color: #eeeeee; padding: 20px; } div.test { margin: 20px; padding: 10px; border: solid black 1px; }

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吧。

下面是我的框架对它的应用,我已把它整合到我的框架中:

异步操作例子 by 司徒正美

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)

});

列队处理。由于是使用了异步,因此不会阻塞页面的演染。

异步操作例子 by 司徒正美dom.require("deferred");

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

*/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。