Promise基础认知
一、Promise是什么?
Promise是最早由社区提出和实现的一种解决异步编程的方案,比其他传统的解决方案(回调函数和事件)更合理和更强大。
ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
等待机制(Promise.all): 使用 Promise.all 方法可以同时等待多个 Promise 对象的完成。只有当所有的 Promise 都成功解析时,返回的 Promise 才进入 resolved 状态,将每个 Promise 的解析结果以数组形式传递给 then() 方法;如果任何一个 Promise 失败拒绝,则返回的 Promise 会进入 rejected 状态,并传递第一个失败的 Promise 的拒绝原因给 catch() 方法。
赛跑机制(Promise.race): 使用 Promise.race 方法可以监听多个 Promise 对象中最先解决或拒绝的那一个,并返回对应的 Promise。无论是被解析还是被拒绝,Promise.race 方法都会返回第一个完成的 Promise 结果或错误。
二、Promise是为解决什么问题而产生的?
promise是为解决异步处理回调地域问题而产生的
三、Promise的两个特点
1、Promise对象的状态不受外界影响
1)pending 初始状态
2)fulfilled 成功状态
3)rejected 失败状态
Promise 有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态
2、Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected
四、Promise的三个缺点
1)无法取消Promise,一旦新建它就会立即执行,无法中途取消
2)如果不设置回调函数,Promise内部抛出的错误,不会反映到外部
3)当处于pending状态时,无法得知目前进展到哪一个阶段,是刚刚开始还是即将完成
五、Promise的用法
每当new一个Promise实例的时候,就会立即执行这个异步操作中的代码,也就是说,new 的时候,除了能够得到 一个 promise 实例之外,还会立即调用我们为Promise构造函数传递的那个function,执行这个 function 中的 异步操作代码,如下代码
简易代码:
简单代码介绍:
const p = new Promise( (resolve,reject)=>{
//异步操作
//异步操作(成功resolve)
//异步操作(失败reject)
}
p.then((XXX)=>{
成功的值
}).catch((XXX)=>{
失败的值
})
实例理解:
const fs = require('fs')
// 给文件的路径,返回读取到的内容
function getFileByPath(fpath) {
return new Promise(function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
})
}
getFileByPath('文件路径')
.then(function (data) {
console.log(data)}, function (err) {
console.log(err.message)})
Promise只用两种返回值,从等待到成功或者失败,当开启了promise,只要有结果返回时,不管成功或者失败,就会实现状态凝固,无法再修改。一般是在.then中接收成功的值,.catch中接收失败的值。
六、Promise All的使用
参数:接受一个数组,数组内都是Promise实例
返回值:返回一个Promise实例,这个Promise实例的状态转移取决于参数的Promise实例的状态变化。当参数中所有的实例都处于resolve状态时,返回的Promise实例会变为resolve状态。如果参数中任意一个实例处于reject状态,返回的Promise实例变为reject状态
解决并发请求:
let p1 = new Promise((resolve, reject) => {
resolve('成功了')
})
let p2 = new Promise((resolve, reject) => {
resolve('success')
})
let p3 = Promse.reject('失败')
Promise.all([p1, p2]).then((result) => {
console.log(result) //['成功了', 'success']
}).catch((error) => {
console.log(error)
})
Promise.all([p1,p3,p2]).then((result) => {
console.log(result)
}).catch((error) => {
console.log(error) // 失败了,打出 '失败'
})
在组件中使用时,当请求比较多时,使用.then和.catch的话会有多层嵌套的问题,此时推荐使用async和await语法糖来代替,可以有效的解决多层嵌套的问题,同时也可以更有效的解决并发请求。
七、 Promise.race(赛跑机制)
参数:接受一个数组,数组内都是Promise实例
返回值:返回一个Promise实例,这个Promise实例的状态转移取决于参数的Promise实例的状态变化。当参数中任何一个实例处于resolve状态时,返回的Promise实例会变为resolve状态。如果参数中任意一个实例处于reject状态,返回的Promise实例变为reject状态。
Promise.race = function(promises){
return new Promise(function(resolve,reject){
for(let i=0;i<promises.length;i++){
promises[i].then(resolve,reject);
}
});
}