##Promise前世今生

作者: 践行者 | 来源:发表于2016-06-20 16:11 被阅读185次

Promise前世今生

浏览器事件模型

    在浏览器中,JavaScript作为单线程运行;另外,对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一个线程中。因此对于长时间的耗时操作,将会阻塞UI的响应。为了更好的UI体验,应该尽量的避免JavaScript中执行较长耗时的操作或者是长时间I/O阻塞的任务。所以在浏览器中的大多数任务都是异步(无阻塞)执行的。在HTML5中引入了新的组件-Web Worker,它可以在JavaScript线程以外执行这些任务,而不阻塞当前UI线程。

浏览器中的事件循环模型

browser-event.jpeg

    由于浏览器的这种内部事件循环机制,JavaScript以callback回调的方式来处理事件任务。因此无所避免的对于多个的JavaScript异步任务的处理,将会遇见”callback hell",使得这类代码及其不可读和难易维护,在视觉上,回调金字塔会让你的代码最终超过屏幕的宽度。***更重要的的是,callback剥夺了return 和throw能力,剥夺我们在栈上执行代码的能力。

Promise从天而降

Promiese解决 多异步callback问题而诞生,解决了代码缩进的问题
那什么是Promise呢?
Promise在英语中语义为:”承诺“,它表示如A调用一个长时间任务B的时候,B将返回一个”承诺“给A,A不用关心整个实施的过程,继续做自己的任务;当B实施完成的时候,会通过A,并将执行A之间的预先约定的回调。而deferred在英语中语义为:”延迟“,这也说明promise解决的问题是一种带有延迟的事件,这个事件会被延迟到未来某个合适点再执行。

漫画解读Promise

Promise结构

Promise设计规范--(https://promisesaplus.com)

1.Promise 对象有三种状态: Pending – Promise对象的初始状态,等到任务的完成或者被拒绝;Fulfilled – 任务执行完成并且成功的状态;Rejected – 任务执行完成并且失败的状态;

2.Promise的状态只可能从“Pending”状态转到“Fulfilled”状态或者“Rejected”状态,而且不能逆向转换,同时“Fulfilled”状态和“Rejected”状态也不能相互转换;

3.Promise对象必须实现then方法,then是promise规范的核心,而且then方法也必须返回一个Promise对象,同一个Promise对象可以注册多个then方法,并且回调的执行顺序跟它们的注册顺序一致

4.then方法接受两个回调函数,它们分别为:成功时的回调和失败时的回调;并且它们分别在:Promise由“Pending”状态转换到“Fulfilled”状态时被调用和在Promise由“Pending”状态转换到“Rejected”状态时被调用。

Promise流程图如下:

promises-流程图.png

Promise将原来回调地狱中的回调函数,从横向式增加巧妙的变为了纵向增长。以链式的风格,纵向的书写,使得代码更加的可读和易于维护。

Promise高级技巧要点

1.多个异步任务的串行处理
2.多个异步任务的并行处理
3.统一调用接口
4.延迟任务的Promise DSL语义化封装
5.利用Promise来实现管道式AOP拦截

Promise使用JS常见错误

移步这里---(http://efe.baidu.com/blog/promises-anti-pattern/)

期待

不错的iOS--PromiseKit框架,传送门--(https://github.com/mxcl/PromiseKit)

JS库看这里--(https://github.com/calvinmetcalf/lie)

下一篇,读源码,学习设计 iOS端的Promise

参考文档

1.MSN

2.promise设计规范

3.http://www.cnblogs.com/whitewolf/p/promise-best-practice.html

4.http://andyshora.com/promises-angularjs-explained-as-cartoon.html

相关文章

  • 讲讲 Promise

    一、什么是 Promise 1.1 Promise 的前世今生 Promise 最早出现在 1988 年,由 Ba...

  • ##Promise前世今生

    Promise前世今生 浏览器事件模型 在浏览器中,JavaScript作为单线程运行;另外,对UI线程操作的安全...

  • Promise的前世今生

    概念 promise对象代表了一个异步操作的结果(成功或失败); 诞生的缘由 在没有promise的时候,当我们处...

  • 将军在上之男昭女惜重生三世千年孽缘

    前世!今生!来世再续! 前世欠谁!今生还!来世再续前缘! 前世因!今生续!来世果!

  • 前世今生来世缘

    谈何前世情 今生还 今生情 来世还 前世孽债 前世还 未了 今生还 今生欠 今生还 谈何来世还 来世欠 来世还 能...

  • 人死,并非如灯灭……

    “今生,是前世的“来生”,是来生的“前世”。在今生中,我们能见到自己的前世与来生。回溯前世,是为了改善今生;回到今...

  • 前生不欠 今生不见

    若無前世緣,何來今生見 前世不回眸,今生怎擦肩 前世若不欠,今生亦不見 今生且不欠,來生即自願

  • JavaScript异步编程简单探索

    关于js异步编程前世今生,从回调函数到事件监听到发布订阅到Promise,网上有很多解释,所以本文仅做对于异步编程...

  • 苹果新贵Swift之前世今生

    苹果新贵Swift之前世今生 苹果新贵Swift之前世今生

  • iOS Device ID 的前世今生

    iOS Device ID 的前世今生 iOS Device ID 的前世今生

网友评论

    本文标题:##Promise前世今生

    本文链接:https://www.haomeiwen.com/subject/zmvwdttx.html