Deferred是前端解决异步操作的一种编程范式,后来出现的Promise规范更是让其普适性大大提高。不过Promise规范也存在分岐。现在最流行的是Promise/A规范。

Promise/A大致是这样的:一个带有then方法的对象,它拥有三个状态,pending,fulfilled, rejected。一开始是pending,执行then 方法后,当其回调被执行,会进入fulfiled或rejected状态。

then方法可传入两个函数,一个是成功时执行,一个是失败时执行,分别叫做onFulfilled, onRejected。then还有第3个参数叫做onNotify,它不会改变对象的状态。这三个函数都是可选的,非函数时会被忽略掉。

乍一看,没什么。主菜在后面。then方法在添加了onFufilled或onRejected会返回一个新的Promise对象。这样一来,就能形成一个Promise链。

显然,jQuery Deferred并不满足后面的那个条件。

后来人们在Promose/A那粗糙的准则上添加更多的细节,形成了Promise/A+, http://promises-aplus.github.io/promises-spec/,重点见Requirements与Notes。

Notes还着重提到为了防止Promise链还没有形成就被用户触发回调,强烈要求使用setTimeout,setImmediate,process.nextTick等异步API来提供回够的构建时间。这思路其实与著名的JSDeferred如出一辙,或者它本来就是从JSDeferred那里剽来的。

此外,大家在实现Promise/A+时,渐渐达成一些共识,添加了all, any等方法,来并归结果或处理竞态状态。现在市面上有三大Promise/A+库,
Q, RSVP , when。其中,Q的微缩版被整进angular.js, RSVP 被整进ember.js ,angular, ember 我后面会重点介绍,都是著名的MVVM库。微软出品的WinJs MVVM框架,也内置一个Promise模块。

jQuery Deferred虽然不标准,但它的出现已表明Deferred/Promise这种异步范式的重要了。

随着avalon“王的三柱臣”之一mmRequest工作的展开,我需要一个更精致的底层异步库。这就是mmDeferred的由来。

现在mmDeferred放在github上,拥有完整的示例与API文档,欢迎大家关注与fork

https://github.com/RubyLouvre/mmDeferred

有关异步库的重要性,可以看我以前写的两篇文章:

javascript 异步编程

javascript 异步编程2

或看屈屈写的这篇文章,是介绍when.js的应用的。

异步编程:When.js快速上手

由于Deferred是如此重要的,ecma262下一版已提议内置此对象了,详见这里

strawman:deferred_functions

前端异步解决方案——mmDeferred的更多相关文章

  1. FIS前端集成解决方案

    FIS前端集成解决方案-文档结构 什么是FIS 部署FIS FIS基本使用 模块定义 加载方式 调用Tangram 2.0 FIS开发实例 --附件下载-- 什么是FIS FIS提供了一套贯穿开发流程 ...

  2. 异步解决方案----Promise与Await

    前言 异步编程模式在前端开发过程中,显得越来越重要.从最开始的XHR到封装后的Ajax都在试图解决异步编程过程中的问题.随着ES6新标准的到来,处理异步数据流又有了新的方案.我们都知道,在传统的aja ...

  3. Redux异步解决方案之Redux-Thunk原理及源码解析

    前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现.但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案.本 ...

  4. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  5. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  6. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

  7. 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)

    前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...

  8. ES7前端异步玩法:async/await理解

    在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是"异步"的意思,async用于声明一个函数是异步的 ...

  9. js async await 终极异步解决方案

    既然有了promise 为什么还要有async await ? 当然是promise 也不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. 回顾 Promise Pr ...

随机推荐

  1. 基于Linux的oracle数据库管理 part2( 数据库 准备,安装,创建 )

    主要内容 1. 准备 2. 安装 与 删除 软件 3. 创建数据库 4. 配置 SQL*PLUS 环境 准备 1. 软件包, rpm –qa , rpm –ivh *.rpm 2. 检查磁盘空间 3. ...

  2. R语言串行与并行Apply用法

    串行 APPLY<- function(m){ mTemp <- apply(m, 2, mysort) return(mTemp)} snowfall包的并行 SNOWFALL<- ...

  3. Qt环境搭建(Visual Studio)

    简述 经常有人问我编写Qt程序时使用什么IDE,其实这个真的很难回答(各有所长),只能说看个人爱好了,因为我两个都用,而且两个都很喜欢(比较多情吧O(∩_∩)O~)! 下面将进行Qt Creator与 ...

  4. shell动态解析sql的binlog

    #!/usr/bin #设置数据库连接 conn='mysql -hhost -Pport -uusername -ppassword' #获取最新的binlog文件 logfile=$($conn ...

  5. HDU 5319 Painter (模拟)

    题意: 一个画家画出一张,有3种颜色的笔,R.G.B.R看成'\',B看成'/',G看成这两种的重叠(即叉形).给的是一个矩阵,矩阵中只有4种符号,除了3种颜色还有'.',代表没有涂色.问最小耗费多少 ...

  6. postgresql - mac 启动 关闭 postgresql

    /Library/PostgreSQL/9.3/bin/pg_ctl -D /Library/PostgreSQL/9.3/data stop /Library/PostgreSQL/9.3/bin/ ...

  7. 【英语】Bingo口语笔记(40) - [aʊ]的发音规则

    [aʊ]的发音规则 先发音标的音再去拼出单词的读音down

  8. Android下监听Home键

    网上看到demo,亲测了以下机器和设备,均测试通过: 测试通过的手机: 1.华为荣耀3(Android 4.2.2) 2.小米2s(Android 4.1.1) 3.联想的手机 (Android2.3 ...

  9. flash wmode参数详解

    在做web开发中可能会遇到flash遮挡页面中元素的情况,无论怎么设置flash容器和层的深度(z-index)也无济于事,现有的解决方案是在插入flash的embed或object标签中加入”wmo ...

  10. Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_4

    4.创建Integration Service后无法启动 1)错误日志: 2)解决办法: 进入Repository Service的属性页面,将其运行模式改成Normal.