- 浏览: 318690 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
完善自我:
支持一下!
揭秘IT人才特点:中美印日四国程序员比较 -
悲剧了:
好文,看玩thinking in java的提到的异常处理,看 ...
高效的Java异常处理框架(转) -
yin_bp:
开源框架bbossgroups页支持组件异步方法调用哦,详情请 ...
Spring 3中异步方法调用 -
flyjava:
sun的悲哀
Apache怒了,威胁说要离开JCP
Thursday, May 6th, 2010 Chaining
. It’s an extremely popular pattern these days in JavaScript. It’s easily achieved by continually returning a reference to the same object between linked methods. However one technique you don’t often see is queueing up a chain of methods,
asynchronously
, by which functions can be linked together
independent of a callback
. This discussion, of course, came from a late work night building the @anywhere
JavaScript API
with two other mad scientists, Russ D’Sa (@dsa) and Dan Webb (@danwrong). Anyway, let’s have a look at some historical conventions and compare them to newer ones. Imagine an iterator class that operated on arrays. It could look like this: This is a simple because we’re working on a known existing object in memory (the alphabet array). However an easy way to spoil our soup is to make our methods continue to operate without existing objects. Like say, for example, a result set you had to make an async request to the server to get. Thus, imagine making this work: In the grand scheme of things, the above example isn’t too far off from from
currying
(which it’s not). And to make another point, currying can often lead to bad coupling of code… which in its defense, is often the point as well. Some libraries even call this pattern
binding
… so… yeah. Anyway, to the point, here is a basic Queue implementation that can be used as a tool to build your own asynchronous method chains. With this code, you can put it straight to work for something useful, like say, a jQuery plugin that fetches content remotely and then appends the results to your selector input. For you plugin developers our there, it would look like this… Then voila! You can make your DOM queries, fetch remote content, and continue your chain, asynchronously. Here’s a
brief example
of showing off the example above. Point being, one can only imagine the possibilities you could do. Say for example, having multiple items in the queue waiting to operate on a response. Thus imagine this… Your internals would look like this with the Queue. And with that, you can call it a night. Cheers.
Asynchronous method queue chaining in JavaScript
// no chaining
var o = new Iter(['a', 'b', 'c', 'd', 'e']);
o.filter(function(letter) {
if (letter != 'c') { return letter; }
});
o.each(function(letter) {
append(letter);
});
// with chaining
new Iter(alphabet).filter(remove_letter_c).each(append);
ajax('/server/results.json').filter(remove_duplicates).append('div#results');
function Queue() {
// store your callbacks
this._methods = [];
// keep a reference to your response
this._response = null;
// all queues start off unflushed
this._flushed = false;
}
Queue.prototype = {
// adds callbacks to your queue
add: function(fn) {
// if the queue had been flushed, return immediately
if (this._flushed) {
fn(this._response);
// otherwise push it on the queue
} else {
this._methods.push(fn);
}
},
flush: function(resp) {
// note: flush only ever happens once
if (this._flushed) {
return;
}
// store your response for subsequent calls after flush()
this._response = resp;
// mark that it's been flushed
this._flushed = true;
// shift 'em out and call 'em back
while (this._methods[0]) {
this._methods.shift()(resp);
}
}
};
<script src="jquery.js"></script>
<script src="async-queue.js"></script>
<script>
(function($) {
$.fn.fetch = function(url) {
var queue = new Queue;
this.each(function() {
var el = this;
queue.add
(function(resp) {
$(el).html(resp);
});
});
$.ajax({
url: url,
dataType: 'html',
success: function(html) {
queue.flush(html);
}
});
return this;
};
})(jQuery);
</script>
$("<div/>")
.fetch('/server/navigation.html')
.addClass('column')
.appendTo('#side');
fetchTweet(url).linkify().filterBadWords().appendTo('#status');
function fetchTweet(url) {
this.queue = new Queue;
this.tweet = "";
var self = this;
ajax(url, function(resp) {
self.tweet = resp;
self.queue.flush(this);
});
}
fetchTweet.prototype = {
linkify: function() {
this.queue.add(function(self) {
self.tweet = self.tweet.replace(/\b@(\w{1,20}\b/g, '<a href="...">$1</a>');
});
return this;
},
filterBadWords: function() {
this.queue.add(function(self) {
self.tweet = self.tweet.replace(/\b(fuck|shit|piss)\b/g, "");
});
return this;
},
appendTo: function(selector) {
this.queue.add(function(self) {
$(self.tweet).appendTo(selector);
});
return this;
}
};
原文:http://www.dustindiaz.com/async-method-queues/
发表评论
-
Web编程是函数式编程
2010-11-30 13:44 1074任何一位在两个领域里 ... -
如何开发Web应用程序
2010-11-30 13:41 1142这是一个经常被问到的 ... -
设计Web应用程序时要注意可伸缩性
2010-11-26 09:19 955Max Indelicato是一位软件 ... -
Web 2.0应用客户端性能问题十大根源
2010-11-25 20:19 1047Web 2.0应用的推广为用户带来了全新的体验,同时也让开 ... -
HTML压缩(JSP的GZIP实现)
2010-11-24 22:31 4945HTTP 压缩可以大大提高浏览网站的速度,它的 ... -
浏览器加载和渲染html的顺序
2010-11-22 09:45 25951.浏览器加载和渲染html的顺序 1、IE下载的顺序是从上到 ... -
在服务端合并和压缩JavaScript和CSS文件
2010-11-22 09:16 1165Web性能优化最佳实践中最重要的一条是减少HTTP请求 ... -
用 YUI Compressor 压缩和混淆 JS 和 CSS
2010-11-22 09:05 2401一、简介: 目前开发Web应用Javas ... -
如何缓存DWR生成的JS文件
2010-11-18 17:37 1977DWR provides a convenient mec ... -
HTTP状态一览
2010-11-17 22:43 782在网站建设的实际应用中,容易出现很多小小的失误,就像m ... -
两款HTTP流量分析工具的比较:HTTP Watch,Fiddler
2010-11-17 17:26 0做Web开发或者Web分析经常需要查看Http通讯的过程, ... -
了解CSS的查找匹配原理,让CSS更简洁、高效
2010-11-17 16:49 0用了这么多年的CSS,现在才明白CSS的真正匹配原理,不知 ... -
高性能WEB开发 - flush让页面分块,逐步呈现
2010-11-17 16:47 0在处理比较耗时的请求的时候,我们总希望先让用户先 ... -
WEB高性能开发 - 疯狂的HTML压缩
2010-11-17 16:46 0前言: ... -
该如何加载google-analytics(或其他第三方)的JS
2010-11-17 16:44 0很多网站为了获取用户访问网站的统计信息,使用了go ... -
高性能WEB开发 - 页面呈现、重绘、回流。
2010-11-17 15:57 0页面呈现流程 在讨论页面重绘、回流之前。需要 ... -
高性能WEB开发 - JS、CSS的合并、压缩、缓存管理
2010-11-17 15:54 0本篇文章主要讨论下目前JS,CSS 合并、压缩、缓存 ... -
高性能WEB开发- 减少请求,响应的数据量
2010-11-17 15:49 0上一篇中我们说 ... -
高性能WEB开发 - 为什么要减少请求数,如何减少请求数!
2010-11-17 15:42 0http请求头的数据量 我们先分析下 ... -
高性能web开发 - 如何加载JS,JS应该放在什么位置?
2010-11-17 15:39 0外部JS的阻塞下载 所有浏览器在下载JS的时候, ...
相关推荐
《JavaScript异步编程》这本书深入探讨了现代JavaScript开发中的关键主题——如何在不陷入混乱的情况下处理并发和并发任务。本书作者Trevor Burnham通过精确平衡的浏览器端和服务器端示例,为读者提供了一份简洁的...
JavaScript异步编程是前端开发领域中的一个重要概念,它允许程序在等待长时间操作(如网络请求)时继续执行其他任务,而不是简单地暂停或停止,从而提升用户体验。本书《JavaScript异步编程》作为图灵程序设计丛书的...
"JavaScript高性能编程"和"JavaScript异步编程"是两个关键的JavaScript专题,对于提升应用程序的性能和用户体验至关重要。 一、JavaScript高性能编程 1. **优化代码执行效率**:了解JavaScript引擎的工作原理,如...
JavaScript异步编程是Web开发中的核心概念,尤其在构建高性能、响应式的网页应用时不可或缺。深入理解这一主题,对于任何JavaScript开发者来说都是至关重要的。在这个教程中,我们将探索JavaScript异步处理的各个...
3. **JavaScript异步编程**: 异步编程是JavaScript的重要特性,用于处理耗时操作,如网络请求和文件读写,以避免阻塞主线程。主要方法有: - 回调函数:最基础的异步处理方式,但可能导致回调地狱问题。 - 事件...
### JavaScript异步编程的四种方法 #### 概述 JavaScript是一种广泛使用的脚本语言,尤其在Web开发领域占据着核心地位。由于浏览器环境的限制,JavaScript最初被设计为单线程执行模型。这意味着在同一时间只能执行...
JavaScript异步代码优化是开发过程中不可或缺的一环,尤其是在前端开发中,由于JavaScript的单线程特性,异步处理显得尤为重要。本文将深入探讨JavaScript异步编程的问题及其优化策略。 首先,我们来关注最常见的一...
实现javascript异步调用 API: window.asyncall(function/functionName[,args,...][,function callback]) 参数说明: function/functionName:方法或方法名称 args:目标方法参数 callback:回调函数...
博客中提到的“源码”和“工具”标签可能意味着作者深入探讨了JavaScript异步编程的实现原理,或者介绍了某些辅助开发的工具或库,比如Promise库bluebird或async/await的polyfill。代码文件可能包含了示例代码或练习...
JavaScript异步编程是前端开发中的重要概念,它允许在执行长时间运行的任务时不会阻塞主线程,从而提升用户体验。异步编程的核心在于,它不会立即得到结果,而是在某个未来的时刻,当任务执行完毕后,才会得到通知。...
藏经阁-JavaScript异步编程 JavaScript异步编程是JavaScript语言的一大特点,它可以使得JavaScript语言在单线程的情况下,执行多个任务,而不需要阻塞其他任务。异步编程的解决方案有多种,包括回调函数、Promise、...
**JavaScript异步Ajax与JSON详解** 在Web开发中,JavaScript异步Ajax技术是不可或缺的一部分,它使得网页可以在不刷新整个页面的情况下与服务器进行数据交互,极大地提升了用户体验。JSON(JavaScript Object ...
本文将深入讲解JavaScript异步编程的基础和高级概念,帮助开发者理解并掌握这一核心技能。 1. **异步编程的基本概念** 在JavaScript中,异步编程意味着某些操作不会阻塞程序的执行,而是以非阻塞的方式进行。这是...
详解JavaScript异步编程中jQuery的promise对象的作用 Promise 对象是 JavaScript 异步编程中的一种重要概念,特别是在 jQuery 库中。Promise 对象的主要作用是解决异步编程中的回调地狱问题,提供了一种简洁的方式...
本话题主要关注如何使用JavaScript异步调用C#代码来实现在Google Map上动态连线的功能。下面我们将深入探讨这个主题。 首先,让我们了解动态连线在Google Map上的实现。动态连线通常指的是在地图上根据实时数据创建...
### JavaScript 实现异步获取表单数据 #### 一、背景介绍 在现代Web开发中,异步操作是一项非常重要的技术。它允许浏览器在等待服务器响应的同时继续...希望这些知识点能帮助您更好地理解和应用JavaScript异步操作。
在现代Web应用中,文件上传是一项常见的功能,而“Flash JavaScript异步上传文件——SWFUpload”正是这种功能的一种实现方式。SWFUpload是一个开源的JavaScript库,它结合了Adobe Flash技术,允许用户在不刷新整个...
其中,最典型的技术就是Ajax(Asynchronous JavaScript and XML),它可以实现页面局部的异步刷新。 #### XMLHttpRequest对象简介 在给定的示例代码中,我们首先创建了一个`XMLHttpRequest`对象。`XMLHttpRequest`...