前端异步解决方案——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

https://github.com/RubyLouvre/mmDeferred

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

javascript 异步编程

javascript 异步编程2

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

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

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

strawman:deferred_functions

 
 
 
标签: javascript

mmDeferred的更多相关文章

  1. JS魔法堂:mmDeferred源码剖析

    一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...

  2. 前端异步解决方案——mmDeferred

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

  3. JS魔法堂:ES6新特性——GeneratorFunction介绍

    一.前言       第一次看koajs的示例时,发现该语句 function *(next){...............} ,这是啥啊?于是搜索一下,原来这是就是ES6的新特性Generator ...

  4. JS魔法堂:剖析源码理解Promises/A规范

    一.前言 Promises/A是由CommonJS组织制定的异步模式编程规范,有不少库已根据该规范及后来经改进的Promises/A+规范提供了实现 如Q, Bluebird, when, rsvp. ...

  5. JS读书心得:《JavaScript框架设计》——第12章 异步处理

    一.何为异步   执行任务的过程可以被分为发起和执行两个部分. 同步执行模式:任务发起后必须等待直到任务执行完成并返回结果后,才会执行下一个任务. 异步执行模式:任务发起后不等待任务执行完成,而是马上 ...

  6. Promise基础

    前言: ES2015将Promise引入语言规范,包括fetch等在内的API也构建在Promise之上.作为让js摆脱“回调地狱”的重要一环和众多框架中的重要基础设施之一,学习如何自己实现一个Pro ...

随机推荐

  1. tiny210——uboot移植Makefile文章分析

    这东西已经写,我们没有时间发布,如今,终于有时间稍微长送记录汇总uboot学习过程.具体了.以后忘了也能够再温习回来嘛有些特殊字符显示得乱掉了 Makefile追踪技巧: 技巧1:能够先从编译目标開始 ...

  2. python tcp socket 多线程

    不多说,直接上代码 client.py #!/usr/bin/python import socket,sys,string host="localhost" port=8000 ...

  3. iOS发展 - 使用您自己的自定义字体

    一位同事问我最后一次,XXapp字体如何萌啊? 我也想提出萌哒哒的字体!然后,今天有这blog. 首先,我们正处于iOS发展,苹果给了我们很多的字体,当然,我就不一一列举在这里,英文,小汤表示看不懂啦 ...

  4. 前端构建利器Grunt—Bower

    runt + Bower—前端构建利器 目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web ...

  5. C语言对mysql数据库的操作

    原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ...

  6. AngularJS + CoffeeScript

    AngularJS + CoffeeScript 前端开发环境配置详解 AngularJS 号称 '第一框架' ('The first framework') 确实是名不虚传.由其从jQuery中完全 ...

  7. Kafka spring 集成

    下载配置kafka参考该链接:http://www.cnblogs.com/super-d2/p/4534323.html pom.xml: <dependency> <groupI ...

  8. CSS学习笔记:文本换行显示(word-wrap)

    在CSS3中新定义了文本换行属性,word-wrap: nomal属性值表示控制连续文本换行. break-word属性值表示内容将在边界内换行.如果需要,词内换行(word-break)也会发生. ...

  9. SSI框架总结

    先来点文字性的描写叙述: MVC对于我们来说,已经不陌生了,它起源于20世纪80年代针对smalltalk语言的一种软件设计模式,如今已被广泛应用.近年来,随着java的盛行,MVC的低耦合性.高重用 ...

  10. SSIS中Sql Task 获取系统变量

    原文:SSIS中Sql Task 获取系统变量 执行 SQL 任务使用不同的连接类型时,SQL 命令的语法使用不同的参数标记.例如,ADO.NET 连接管理器类型要求 SQL 命令使用格式为 @var ...