一、Promise 是什么?
从语法上来说是一个 构造函数,从功能上来说是一个封装好的解决异步加载的方法(注意:同步 是在他的构造函数中,异步回调是在 .then()里面执行的)
二、Promise 用来解决什么的?
一个是 为了解决 异步 回调 必须 在启动任务之前执行,还有一个是为了解决 回调地狱的问题
Promise的两个特点
1.Promise对象的状态不受外界影响
- pending 初始状态
- fulfilled 成功状态
- rejected 失败状态
Promise 有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态
2.Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected
使用 new 来创建一个promise对象
Promise 接受一个「函数」作为参数,该函数的两个参数分别是resolve和reject。这两个函数就是就是「回调函数」
resolve 函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject 函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
const promise = new Promise((resolve, reject) => {
if (success) {
resolve(value); // fulfilled
} else {
reject(error); // rejected
}
});
Promise的API
1、Promise.then(resolve,reject)
resolve
:就是Promise对象成功的回调处理函数,指向 resolvereject
:就是Promise对象失败的回调处理函数
new Promise((resolve,reject)=>{
fs.readFile('./data/a.txt','utf8',(err,data)=>{
if(err){
return reject(err)
}
resolve(data)
})
}).then((resolveData)=>{
console.log(resolveData)
},(rejectErr)=>{
})
2、Promise.all()
Promise.all() 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
function readFile(filePath, encoding) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, encoding, (err, data) => {
if (err) {
return reject(err)
}
resolve(data)
})
})
}
Promise
.all([readFile('./data/a.txt', 'utf8'), readFile('./data/b.txt', 'utf8'), readFile('./data/c.txt', 'utf8')])
.then(data => {
console.log(data)
})
.catch(err => {
console.log(err)
})
3、Promise.catch()
Promise.catch() 它可以和 then 的第二个参数一样,用来指定 reject 的回调
new Promise((resolve,reject)=>{
reject('出错了')
})
.catch(err=>{
console.log(err) // 出错了
})
4、Promise.resolve()
Promise.resolve()将一个值,数字,字符串…转换为Promise对象
Promise.resolve(111)
.then(data=>{
console.log(data) //111
})
5、Promise.reject()
Promise.reject('出错了')
.then(null,err=>{
console.log(err)//出错了
})
// 等价于
new Promise((resolve,reject)=>{
reject('出错了')
})
.then(null,err=>{
console.log(err) //出错了
})