1. 是什么
Promise 是用于表示一个异步操作的最终结果的对象,并提供 then 方法接受异步操作的成功回调和失败回调,Promise 规定, then 方法的第一个参数是成功回调,第二个参数是失败回调。
2. 如何创建一个 Promise 对象
function fn(){
return new Promise((resolve,reject)=>{
成功时调用 resolve(数据)
失败时调用 reject(错误)
})
}
function success(data){
//...
}
function fail(error){
//...
}
fn().then(success,fail).then(success2,fail2) //无论成功回调还是失败回调都只接受一个参数
3. 为什么要用 Promise
不使用 Promise 的异步回调方法如下:
3.1 回调接受两个参数
在 nodejs 中的异步回调就是接受两个参数
fs.readFile('./1.txt', (error, data)=>{
if(error){
console.log('失败');
return;
}
console.log(data.toString()) //成功
})
3.2 两个回调函数
可以为成功和失败两种情况各定义一个回调函数,在旧版本的AJAX 中就是这样做的。
ajax('get','/1.json', (data)=>{}, (error)=>{})
ajax('get', '/1.json', {
success: ()=>{},
fail: ()=>{}
})
4. Promise 的优点
上述方法可以实现异步回调,但存在一些问题,如下:
- 命名不规范,有人用 success + fail,有人用 done + fail,有人用 success + error,没有统一的标准。
- 容易出现回调地狱,使代码变得看不懂
- 很难进行错误处理
同样的,Promise 的出现解决了这些问题,使用 Promise 的优点:
- 规范了回调的名字或顺序
- 没有回调地狱,代码可读性强
- 很方便地捕获错误
5. Promise.all()方法
参数为一个 Promise 的数组,用于处理多个Promise对象的状态集合,如下:
Promise.all([promise1, promise2,promise3]).then(success, fail)
//当 promise1、promise2、promise3都成功时才回调success函数,成功数据为三个Promise成功数据的数组
//当有一个失败时就回调 fail 函数,错误信息为第一个触发失败的Promise对象的错误信息
同成功就成功,一失败就失败
6. Promise.race()方法
race 是比赛的意思,就是指在一组 Promise 对象中,子 Promise 谁最先触发成功或失败,父 promise 马上也会用该子 promise 的成功返回值或失败详情作为参数调用父 promise 绑定的相应句柄。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。