zoukankan      html  css  js  c++  java
  • 前端异步解决方案——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

  • 相关阅读:
    贪心法之活动安排问题
    动态规划算法之最优二叉搜索树
    动态规划之最大字段和问题
    动态规划算法之图像压缩问题
    动态规划算法之0-1背包问题
    动态规划算法之投资问题
    平面点集的凸包问题
    动态规划(DP)之多边形游戏问题
    凸多边形最优三角划分
    最长公共子序列问题
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/3290833.html
Copyright © 2011-2022 走看看