前端异步解决方案——mmDeferred
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
有关异步库的重要性,可以看我以前写的两篇文章:
或看屈屈写的这篇文章,是介绍when.js的应用的。
由于Deferred是如此重要的,ecma262下一版已提议内置此对象了,详见这里
前端异步解决方案——mmDeferred的更多相关文章
- FIS前端集成解决方案
FIS前端集成解决方案-文档结构 什么是FIS 部署FIS FIS基本使用 模块定义 加载方式 调用Tangram 2.0 FIS开发实例 --附件下载-- 什么是FIS FIS提供了一套贯穿开发流程 ...
- 异步解决方案----Promise与Await
前言 异步编程模式在前端开发过程中,显得越来越重要.从最开始的XHR到封装后的Ajax都在试图解决异步编程过程中的问题.随着ES6新标准的到来,处理异步数据流又有了新的方案.我们都知道,在传统的aja ...
- Redux异步解决方案之Redux-Thunk原理及源码解析
前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现.但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案.本 ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)
相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...
- 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)
前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...
- ES7前端异步玩法:async/await理解
在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是"异步"的意思,async用于声明一个函数是异步的 ...
- js async await 终极异步解决方案
既然有了promise 为什么还要有async await ? 当然是promise 也不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. 回顾 Promise Pr ...
随机推荐
- json和jsonp的使用格式
最近一直在看关于json和jsonp的区别和各自的用法.优缺点! 下面是我看到过解释最清楚的一片文章 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求 ...
- html_表单
一.表单框架简介 表单是提供让读者在网页上输入,勾选和选取数据,以便提交给服务器数据库的工具.(用于将信息提交给服务器) <form>...</form>标记 作用:用于创建一 ...
- Phpstorm Xdebug Web程序调试
平时调试php程序的时候,可以通过在代码中添加var_dump等函数来实现简单的断点调试. 下面介绍另一种方法,通过Phpstorm和Xdebug来进行调试. 1.下载Xdebug 这个是官网下载地址 ...
- Eclipse实用快捷键
经典常用快捷键1. [ALT+/]此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时,多体验一下[ALT+/]快捷键带来的好处吧. 2. ...
- 查询mysql数据库表的信息(表大小、数据大小、索引大小)
select * from information_schema.TABLES where information_schema.TABLES.TABLE_SCHEMA='databasename' ...
- Java中原子类的实现
Java提供的原子类是靠sun基于CAS实现的,CAS是一种乐观锁.关于乐观锁与悲观锁. 原子变量类相当于一种泛化的volatile变量,能够支持原子的和有条件的读-改-写操作.AtomicInteg ...
- ios ble 参考
About Core Bluetooth https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Con ...
- 【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
原文网址:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用 ...
- 如何自定义一个优雅的ContentProvider
最近在code review的时候发现很多人的provider定义的不是很好,写的很粗糙 以至于代码健壮性不够好,可读性也不强 但是你既然写了content provider 就是要给别人调用的,如果 ...
- JBPM4入门——8.等待节点的分支执行
JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...