TAT.dmyang JavaScript Promise 启示录
In 未分类 on 2014年05月04日 by view: 53,448
24

本篇,主要普及 promise 的用法。

一直以来,JavaScript 处理异步都是以 callback 的方式,在前端开发领域 callback 机制几乎深入人心。在设计 API 的时候,不管是浏览器厂商还是 SDK 开发商亦或是各种类库的作者,基本上都已经遵循着 callback 的套路。

近几年随着 JavaScript 开发模式的逐渐成熟,CommonJS 规范顺势而生,其中就包括提出了 Promise 规范,Promise 完全改变了 js 异步编程的写法,让异步编程变得十分的易于理解。

在 callback 的模型里边,我们假设需要执行一个异步队列,代码看起来可能像这样:

这也就是我们常说的回调金字塔,当异步的任务很多的时候,维护大量的 callback 将是一场灾难。当今 Node.js 大热,好像很多团队都要用它来做点东西以沾沾 “洋气”,曾经跟一个运维的同学聊天,他们也是打算使用 Node.js 做一些事情,可是一想到 js 的层层回调就望而却步。

好,扯淡完毕,下面进入正题。

Promise 可能大家都不陌生,因为 Promise 规范已经出来好一段时间了,同时 Promise 也已经纳入了 ES6,而且高版本的 chrome、firefox 浏览器都已经原生实现了 Promise,只不过和现如今流行的类 Promise 类库相比少些 API。

所谓 Promise,字面上可以理解为 “承诺”,就是说 A 调用 B,B 返回一个 “承诺” 给 A,然后 A 就可以在写计划的时候这么写:当 B 返回结果给我的时候,A 执行方案 S1,反之如果 B 因为什么原因没有给到 A 想要的结果,那么 A 执行应急方案 S2,这样一来,所有的潜在风险都在 A 的可控范围之内了。

上面这句话,翻译成代码类似:

只看上面这行代码,好像看不出什么特别之处。但现实情况可能比这个复杂许多,A 要完成一件事,可能要依赖不止 B 一个人的响应,可能需要同时向多个人询问,当收到所有的应答之后再执行下一步的方案。最终翻译成代码可能像这样: