1. 是什么

Promise 是用于表示一个异步操作的最终结果的对象,并提供 then 方法接受异步操作的成功回调和失败回调,Promise 规定, then 方法的第一个参数是成功回调,第二个参数是失败回调。

2. 如何创建一个 Promise 对象

  1. function fn(){
  2. return new Promise((resolve,reject)=>{
  3. 成功时调用 resolve(数据)
  4. 失败时调用 reject(错误)
  5. })
  6. }
  7. function success(data){
  8. //...
  9. }
  10. function fail(error){
  11. //...
  12. }
  13. fn().then(success,fail).then(success2,fail2) //无论成功回调还是失败回调都只接受一个参数

3. 为什么要用 Promise

不使用 Promise 的异步回调方法如下:

3.1 回调接受两个参数

在 nodejs 中的异步回调就是接受两个参数

  1. fs.readFile('./1.txt', (error, data)=>{
  2. if(error){
  3. console.log('失败');
  4. return;
  5. }
  6. console.log(data.toString()) //成功
  7. })

3.2 两个回调函数

可以为成功和失败两种情况各定义一个回调函数,在旧版本的AJAX 中就是这样做的。

  1. ajax('get','/1.json', (data)=>{}, (error)=>{})
  2. ajax('get', '/1.json', {
  3. success: ()=>{},
  4. fail: ()=>{}
  5. })

4. Promise 的优点

上述方法可以实现异步回调,但存在一些问题,如下:

  1. 命名不规范,有人用 success + fail,有人用 done + fail,有人用 success + error,没有统一的标准。
  2. 容易出现回调地狱,使代码变得看不懂
  3. 很难进行错误处理

同样的,Promise 的出现解决了这些问题,使用 Promise 的优点:

  1. 规范了回调的名字或顺序
  2. 没有回调地狱,代码可读性强
  3. 很方便地捕获错误

5. Promise.all()方法

参数为一个 Promise 的数组,用于处理多个Promise对象的状态集合,如下:

  1. Promise.all([promise1, promise2,promise3]).then(success, fail)
  2. //当 promise1、promise2、promise3都成功时才回调success函数,成功数据为三个Promise成功数据的数组
  3. //当有一个失败时就回调 fail 函数,错误信息为第一个触发失败的Promise对象的错误信息

同成功就成功,一失败就失败

6. Promise.race()方法

race 是比赛的意思,就是指在一组 Promise 对象中,子 Promise 谁最先触发成功或失败,父 promise 马上也会用该子 promise 的成功返回值或失败详情作为参数调用父 promise 绑定的相应句柄。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。