`

jQuery 中的 Deferred 和 Promises-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

  • 大小: 71.1 KB
分享到:
评论

相关推荐

    Javascript中的异步编程规范Promises/A详细介绍

    主要介绍了Javascript中的异步编程规范Promises/A详细介绍,同时介绍了jQuery 中的 Deferred 和 Promises,需要的朋友可以参考下

    jqpromise.js:包装jQuery.Deferred以使其更像本机Promises

    当jQuery中埋藏了一个“足够好”的实现时,为什么还要加载一个单独的Promises poly-fill? 该包装器导出一个内部使用$ .Deferred的新构造函数。 不同之处在于,该参数与本机Promises使用的回调类型相同,而不是$ ....

    jQuery Design Patterns(PACKT,2016)

    jQuery is a feature-rich ... Efficiently orchestrate asynchronous procedures using jQuery Deferred and Promises Utilize the most widely-used client-side templating libraries for more complex use cases

    jQuery之Deferred对象详解

    deferred对象是jQuery对Promises接口的实现。它是非同步操作的通用接口,可以被看作是一个等待完成的任务,开发者通过一些通过的接口对其进行设置。事实上,它扮演代理人(proxy)的角色,将那些非同步操作包装成...

    详解jQuery中的deferred对象的使用(一)

    deferred对象是jQuery对Promises接口的实现。接下来通过本文给大家详解介绍jQuery中的deferred对象的使用(一),需要的朋友一起学习吧

    jQuery.Design.Patterns.178588

    Efficiently orchestrate asynchronous procedures using jQuery Deferred and Promises Utilize the most widely-used client-side templating libraries for more complex use cases About the Author Thodoris ...

    以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题

    Promises是一种令代码异步行为更加优雅的抽象,它很有可能是JavaScript的下一个编程范式,一个Promise即表示任务结果,无论该...本文以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题,需要的朋友参考下

    jQuery.deferred对象使用详解

    jQuery1.5之前,如果需要多次Ajax操作,我们一般会使用下面的两种方式: 1).串行调用Ajax $.ajax({ success: function() { $.ajax({ success: function() { $.ajax({ //callbacks... }); }); }); 这种方式...

    Android代码-jdeferred

    JDeferred is a Java Deferred/Promise library similar to JQuery's Deferred Object. Inspired by JQuery and Android Deferred Object. Features Deferred object and Promise Promise callbacks .then(…) ....

    media-uploader:使用 Backbone.js 的完整轻量级 JS 媒体上传器解决方案

    媒体上传器这个 repo 包含一个完整的、轻量级的 JS 媒体上传解决方案... 文件用于管理上传的 jQuery.Deferred 和 promises 主干视图、模型、集合和事件轻量级 - 代码尽可能干净和干燥“进度”和“完成”模板(下划线)

Global site tag (gtag.js) - Google Analytics