jQuery 中的 Deferred 和 Promises-Promises/A规范

news/2024/7/11 0:00:36 标签: jQuery, Deferred, Promises/A规范

  Javascript里异步编程逐渐被大家接受,先前大家一般通过回调嵌套,setTimeout、setInterval等方式实现,代码看起来非常不直观,不看整个代码逻辑很难快速理解。Javascript里异步函数大概有I/O函数(Ajax、postMessage、img load、script load等)、计时函数(setTimeout、setInterval)等。

  这些我们都很熟悉,在复杂的应用中往往会嵌套多层,甚至以为某些步骤未完成而导致程序异常,最简单的例子:比如你往DOM中注入节点,你必须等待节点注入后在操作这个节点,当大量节点注入的时候,时间往往很难把握。如果我们得代码依赖第三方api的数据。我们无法获悉一个API响应的延迟时间,应用程序的其他部分可能会被阻塞,直到它返回结果。Promises对这个问题提供了一个更好的解决方案,它是非阻塞的,并且与代码完全解耦 。

  那么,我看看Javascript里异步编程,首先推荐大家看看相对来说比较流行的Promises/A规范

Promises/A规范

  注:为了便于理解,描述可能和Promises/A规范有所出入;

  CommonJS之Promises/A规范,通过规范API接口来简化异步编程,使我们的异步逻辑代码更易理解。

遵循Promises/A规范的实现我们称之为Promise对象,Promise对象有且仅有三种状态:unfulfilled(未完成)、fulfilled(已完成)、failed(失败/拒绝);初始创建的时候是unfulfilled(未完成)状态,状态只可以从unfulfilled(未完成)变成fulfilled(已完成),或者unfulfilled(未完成)变成failed(失败/拒绝)。状态一旦变成fulfilled(已完成)或者failed(失败/拒绝),状态就不能再变了。

  Promises/A规范提供了一个在程序中描述延时(或将来)概念的解决方案。主要的思想不是执行一个方法然后阻塞应用程序等待结果返回后再回调其他方法,而是返回一个Promise对象来满足未来监听。fulfilled状态和failed状态都可以被监听。Promise通过实现一个then接口来返回Promise对象来注册回调:

js 代码:

then(fulfilledHandler, errorHandler, progressHandler);

  then接口用于监听一个Promise的不同状态。fulfilledHandler用于监听fulfilled(已完成)状态,errorHandler用于监听failed(失败/拒绝)状态,progressHandler用于监听unfulfilled(未完成)状态。Promise不强制实现unfulfilled(未完成)的事件监听(例如我们知道旧版本的jQuery(1.5,1.6)的Deferred就是一个Promise的实现,但没有实现对unfulfilled(未完成)状态的监听来回调progressHandler)。

  一般认为,then接口返回的是一个新的Promise对象,而不是原来的Promise对象,这个新的新的Promise对象可以理解为是原来Promise对象的一个视图,它只包含原有Promise对象的一组方法,这些方法只能观察原有Promise对象的状态,而无法更改deferred对象的内在状态。这样可以避免多个调用者之间的冲突,多个调用者可以通过改变新的Promise对象状态而不影响别的调用者。

  另外,Promise提供了resolve(实现状态由未完成到已完成)和reject(实现状态由未完成到拒绝或失败)两个接口实现状态的转变。

  发一张图片帮助理解一下:


  有了Promise,就可以以同步的思维去编写异步的逻辑了。在异步函数里,不能使用try/catch捕获异常,也不能抛出异常。有了Promise,我们可以直接显式定义errorHandler,相当于捕获异常。

  以下是几个遵循Promises/A规范的类库,when,q,rsvp.js,jQuery.Deferred等等。

  各个Promises类库的比较可以查看:http://complexitymaze.com/2014/03/03/javascript-promises-a-comparison-of-libraries/?utm_source=javascriptweekly&utm_medium=email

 

文章来源:http://www.css88.com/archives/4743


http://www.niftyadmin.cn/n/1316317.html

相关文章

关于Unity3d粒子系统的小发现(天堂3技能释放)

导入系统给的粒子包,发现了一个问题:系统的粒子都有移动轨迹。 而自己新建的空粒子系统却没有这个功能。顺便也复习一下粒子系统。 Particle System (粒子系统): Duration(持续时间) Looping&am…

jQuery 中的 Deferred 和 Promises

看前首先了解:Promises/A规范,具体可以看这里,http://bijian1013.iteye.com/blog/2392429 由于jQuery版本问题对Deferred对象的实现有所不同,具体请参照jQuery api。 jQuery.Deferred()基于Promises/A规范实现,因为jQu…

PHP MVC 中的MODEL层

Model层,就是MVC模式中的数据处理层,用来进行数据和商业逻辑的装封 三、实现你的Mode层 Model层,就是MVC模式中的数据处理层,用来进行数据和商业逻辑的装封,进行他的设计的时候设计到三个个概念:------Model类。是实体…

angular中的异常机制与异常之外的处理

在查阅angularjs的官方文档发现:文档中提到了throw异常 angular.module(exceptionOverride, []).factory($exceptionHandler, function() {return function(exception, cause) {exception.message (caused by " cause ");throw exception;}; }); 同时…

深究AngularJS——监听模型$watch

一.前言 1.$watch是scope内置的函数,它的作用是用来监听数据的变化。 2.$watch可监听哪些数据? 单个对象的属性 需要计算的结果(函数) 3. 语法: $scope.$watch(F,M,B); 二.对$watch参数的了解 F:要监听的数据&…

php编程常用经验

1、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手册中说ech…

深究AngularJS—如何获取input的焦点(自定义指令)

一.写在前面 关于如何获取input框、textarea等的焦点,网上有许多文章都只是会跟你说ng-focus这个内置指令。像这种解答,只能说明作者并为真正理解人家的需求。ng-focus是一个事件,跟原生JS(JavaScript)的onfocus是一样…

angular中的路由简单使用

在单页面应用程序中比如angular应用,我们需要根据url的变化(即:不同的请求),来分配不同的资源。根据请求的URL来决定执行哪个模块,这个过程叫路由,同时,我们需要设计路由规则。 下面给出一个简单的小demo&a…