Promise

55 阅读2分钟

一、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对象成功的回调处理函数,指向 resolve
  • reject:就是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) //出错了
})