1、约定
- 本文的 demo 代码有些是伪代码,不可以直接执行。
- 没有特殊说明,本文所有 demo 都是基于 ES6 规范。
- Object.method 代表是静态方法, Object#method 代表的是实例方法。如 Promise#then 代表的是 Promise 的实例方法, Promise.resolve 代表的是 Promise 的静态方法.
2、什么是 Promise?
首先我们来了解 Promise 到底是怎么一回事
Promise 是抽象的异步处理对象,以及对其进行各种操作的组件。我知道这样解释你肯定还是不明白 Promise 是什么东西,你可以把 Promise 理解成一个 容器,里面装着将来才会结束的一个事件的结果,这个事件通常是一个异步操作。
Promise最初被提出是在 E语言中, 它是基于并列/并行处理设计的一种编程语言。Javascript 在 ES6 之后也开始支持 Promise 特性了,用来解决异步操 的问题。这里顺便解释一下什么是 ES6, ECMAScript 是 Javascript 语言的国际标准,Javascript 是 ECMAScript 的有一个实现, 而ES6(全称 ECMAScript 6)是这个标准的一个版本。
3、Javascript 为什么要引入 Promise?
细心的你可能发现了我刚刚说了 Javascript 支持 Promise 实现是为了解决异步操作的问题。谈到异步操作,你可能会说,Javascript 不是可以用回调 函数处理异步操作吗? 原因就是 Promise 是一种更强大的异步处理方式,而且她有统一的 API 和规范,下面分别看看传统处理异步操作和 Promise 处理 异步操作有哪些不同。
使用回调函数处理异步操作:
login("http://www.r9it.com/login.php", function(error, result){ // 登录失败处理 if(error){ throw error; } // 登录成功时处理 });
Node.js等则规定在JavaScript的回调函数的第一个参数为 Error 对象,这也是它的一个惯例。 像上面这样基于回调函数的异步处理如果统一参数使用规则的话,写法也会很明了。 但是,这也仅是编码规约而已,即使采用不同的写法也不会出错。 而Promise则是把类似的异步处理对象和处理规则进行规范化, 并按照采用统一的接口来编写,而采取规定方法之外的写法都会出错。
使用 Promise 处理异步操作:
var promise = loginByPromise("http://www.r9it.com/login.php"); promise.then(function(result){ // 登录成功时处理 }).catch(function(error){ // 登录失败时处理 });
通过上面两个 demo 你会发现,有了Promise对象,就可以将异步操作以同步操作的流程表达出来。 这样在处理多个异步操作的时候还可以避免了层层嵌套的回调函数(后面会有演示)。 此外,Promise对象提供统一的接口,必须通过调用