这篇文章,我们一起探索一下 JavaScript 中的 Deferred 和 Promise 的概念,它们是 JavaScript 工具包(如Dojo和MochiKit)中非常重要的一个功能,最近也首次亮相于 流行的 JavaScript 库 jQuery(已经是1.5版本的事情了)。 Deferred 提供了一个抽象的非阻塞的解决方案(如 Ajax 请求的响应),它创建一个 “promise” 对象,其目的是在未来某个时间点返回一个响应。如果您之前没有接触过 “promise”,我们将会在下面做详细介绍。
- 经典的白富美型 jQuery 图片轮播插件
- 2012年最佳 Web 前端开发工具和框架
- 构建杀手级应用 JavaScript 工具和技术
- 10套精美的免费网站后台管理系统模板
- 精心挑选的优秀 jQuery Ajax 分页插件
抽象来说,deferreds 可以理解为表示需要长时间才能完成的耗时操作的一种方式,相比于阻塞式函数它们是异步的,而不是阻塞应用程序等待其完成然后返回结果。deferred对 象会立即返回,然后你可以把回调函数绑定到deferred对象上,它们会在异步处理完成后被调用。
Promise
你可能已经阅读过一些关于promise和deferreds实现细节的资料。在本章节中,我们大致介绍下promise如何工作,这些在几乎所有的支持deferreds的javascript框架中都是适用的。
一般情况下,promise作为一个模型,提供了一个在软件工程中描述延时(或将来)概念的解决方案。它背后的思想我们已经介绍过:不是执行一个方法然后阻塞应用程序等待结果返回,而是返回一个promise对象来满足未来值。
举一个例子会有助于理解,假设你正在建设一个web应用程序, 它很大程度上依赖第三方api的数据。那么就会面临一个共同的问题:我们无法获悉一个API响应的延迟时间,应用程序的其他部分可能会被阻塞,直到它返回 结果。Deferreds 对这个问题提供了一个更好的解决方案,它是非阻塞的,并且与代码完全解耦 。
Promise/A提议’定义了一个’then‘方法来注册回调,当处理函数返回结果时回调会执行。它返回一个promise的伪代码看起来是这样的:
此外,promise回调会在处于以下两种不同的状态下执行:
- resolved:在这种情况下,数据是可用
- rejected:在这种情况下,出现了错误,没有可用的值
幸运的是,'then'方法接受两个参数:一个用于promise得到了解决(resolved),另一个用于promise拒绝(rejected)。让我们回到伪代码:
在某些情况下,我们需要获得多个返回结果后,再继续执行应用程序(例如,在用户可以选择他们感兴趣的选项前,显示一组动态的选项)。这种情况下,'when'方法可以用来解决所有的promise都满足后才能继续执行的场景。
一个很好的例子是这样一个场景,你可能同时有多个正在运行的动画。 如果不跟踪每个动画执行完成后的回调,很难做到在动画完成后执行下一步任务。然而使用promise和‘when’方式却可以很直截了当的表示: 一旦动画执行完成,就可以执行下一步任务。最终的结果是我们可以可以简单的用一个回调来解决多个动画执行结果的等待问题。 例如:
这意味着,基本上可以用非阻塞的逻辑方式编写代码并异步执行。 而不是直接将回调传递给函数,这可能会导致紧耦合的接口,通过promise模式可以很容易区分同步和异步的概念。
在下一节中,我们将着眼于jQuery实现的deferreds,你可能会发现它明显比现在所看到的promise模式要简单。
jQuery的Deferreds
jQuery在1.5版本中首次引入了deferreds。它 所实现的方法与我们之前描述的抽象的概念没有大的差别。原则上,你获得了在未来某个时候得到‘延时’返回值的能力。在此之前是无法单独使用的。 Deferreds 作为对ajax模块较大重写的一部分添加进来,它遵循了CommonJS的promise/ A设计。1.5和先前的版本包含deferred功能,可以使$.ajax() 接收调用完成及请求出错的回调,但却存在严重的耦合。开发人员通常会使用其他库或工具包来处理延迟任务。新版本的jQuery提供了一些增强的方式来管理 回调,提供更加灵活的方式建立回调,而不用关心原始的回调是否已经触发。 同时值得注意的是,jQuery的递延对象支持多个回调绑定多个任务,任务本身可以既可以是同步也可以是异步的。
您可以浏览下表中的递延功能,有助于了解哪些功能是你需要的:
当延迟成功时调用一个函数或者数组函数.
deferred.fail()当延迟失败时调用一个函数或者数组函数.。
deferred.resolve(ARG1,ARG2,...)调用Deferred对象注册的‘done’回调函数并传递参数deferred.resolveWith(context,args)调用Deferred对象注册的‘done’回调函数并传递参数和设置回调上下文deferred.isResolved确定一个Deferred对象是否已经解决。deferred.reject(arg1,arg2,...)调用Deferred对象注册的‘fail’回调函数并传递参数deferred.rejectWith(context,args)调用Def在IE6中设置display:block的空容器一个较小高度时,如<p ></p>,会发现其高度不能小于某个值
demo1:设置font-size:0,但是这个容器的高度最小为2px,所以没有办法实现高度为1px的效果
<p ><br/></p> <!-- demo3 -->
demo2 & demo3:在容器中增加内容或其他空标签,如 、<br />,并设置line-height:0,虽然可实现效果,
但该容器会存在一个和其父容器字体大小有关的外边距
<p ><br/></p><!-- demo5 -->
demo4 & demo5:虽然可以解决外边距的问题,但是在font-family:fixedsys(window的古老字体)等字体下还是会产生问题。
demo6:目前看到的最好的解决方案
本文链接
ASP.NET中 HTML标签总结及使用。
1.A,运行效果图返回顶部HTML标签
1,普通按钮: 作用:它需要程序员手动地去提交2,重置按钮: 作用:清除已填写的所有文本框的内容
3,提交按钮: 作用:表单提交到服务器(特点:带有刷新属性)
4,文本框:
5,密码框:
6,文本域:
7,上传控件:
8,隐藏域: 作用:保存不让用看到参数
9,复选框:篮球,足球 注意:同一组要有相同的组名 name="a"
10,单选框:男 女 注意:同9
11,表格
表格
12,图片标签:
12_1,图片 12_2,图片按钮
13,下拉框:
13_1,单选下拉框 省份:山东河北湖南
13_2,多选列表:山东河北湖南山东河北湖南 提示:Ctrl+单击
14,横线:
15,DIV
<h3>HTML标签</h3>
1,普通按钮:<input id="Button1" type="button" value="button" /> 作用:它需要程序员手动地去提交<br />
2,重置按钮:<input id="Reset1" type="reset" value="reset" />
作用:清除已填写的所有文本框的内容<br />
3,提交按钮:<input id="Submit1" type="submit" value="submit" />
作用:表单提交到服务器(特点:带有刷新属性)<br />
<br />
4,文本框:<input id="Text1" type="text" /><br />
5,密码框:<input id="Password1" type="password" /><br />
6,文本域:<textarea id="TextArea1" cols="20" name="S1" rows="2"></textarea><br />
<br />
7,上传控件:<input id="File1" type="file" /><br />
8,隐藏域:<input id="Hidden1" type="hidden" value="ylb"/>
作用:保存不让用看到参数<br />
<br />