发布自 Kindem的博客,欢迎你们转载,可是要注意注明出处。另外,该文章收纳在 Kindem的我的的 IT 知识整理仓库,欢迎 Star、Fork、投稿
因为JavaScript
是单线程的,因此回调是JavaScript
中避免不了的,全部的网络请求、浏览器事件都须要使用回调的方式异步处理。javascript
一旦请求、事件多了,就避免不了回调地狱
,回调极可能容易一层接着一层。java
Promise
的意思是承诺,做用和回调函数类似,在将来的某个时刻执行某件事情。可是Promise
的写法更加简约易用,更加符合咱们日常的思惟。git
Promise
是一个对象,在ES6已经被规范成了原生JavaScript
的一部分,可是在ES6以前,则须要使用第三方库来实现github
Promise
分为三个状态:promise
pending
: 执行中resolved
: 已完成rejected
: 已失败Promise
对象被实例化的那一刻,传入构造函数的方法将会被执行,而且进入pending
状态,而一旦完成或者失败,则会进入相应的状态,这一过程是不可逆的浏览器
他的用法(ES6)以下:网络
let promise = new Promise((resolve, reject) => { if (...) { // 若是成功了 resolve(...); } else { // 若是失败了 reject(...); } });
这里的resolve
和reject
两个方法可使用下面的方法来给与:异步
promise .then(onSuccess) .catch(onFailed);
传递给then
的方法将在承诺执行成功时被调用,传递给catch
的方法将在承诺执行失败时被调用函数
更加方便的一点是,Promise
每每能够嵌套使用,这样能够是多个任务有条不紊地进行,假设p1
是一个Promise
对象而p2
、p3
都是可以产生Promise
对象的方法(若是直接new
那么Promise
将会被直接执行),那么你能够这样写,使得他们按照顺序执行,而且能够一次性处理他们产生的错误线程
p1 .then(p2) .then(p3) .then(onSuccess) .catch(onFailed);
好比:
let p1 = new Promise((resolve, reject) => { console.log('p1'); setTimeout(() => { resolve('p2'); }, 1000) }); let p2 = (result) => new Promise((resolve, reject) => { console.log(result); setTimeout(() => { resolve('p3'); }, 2000); }); let p3 = (result) => new Promise((resolve, reject) => { console.log(result); setTimeout(() => { resolve('over'); }, 3000); }); p1 .then(p2) .then(p3) .then((result) => { console.log(result); }) .catch((error) => { console.log(error); });
运行能够看见:
p1 p2 p3 over