- List item
【es6】Promise
一、Promise的基本概念
-
Promise是ES6出来的一个构造函数,可以new一个Promise实例
-
函数参数有两个参数 resolve(成功之后的回调函数) 、reject(失败之后的回调函数)
-
-Promise一旦声明就会立刻执行一次里面的代码
-
用来解决回调地狱
二、Promise的三种状态
- pending(进行中)、 当promise实例化出时状态就为pending
- fulfilled(已成功) 调用resolve就是已成功状态
也就是说你写 resolve() 除了可以调用你传入的回调函数,还可以把状态改为 已成功fulfilled - rejected(已失败) 调用reject就是已失败状态
也就是说你写 reject() 除了调用你传入的回调函数,还把状态改成了 已失败(rejected) - 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
三、基本使用
//概念看的再多,也不一定能知道如何使用,接下来我们通过代码来看看Promise的使用和好处
//实例化promise
const promise = new Promise(function(resolve, reject) {
let a = 1
if (a == 1) {
//成功
resolve(a)
} else {
//失败
reject(error)
}
})
四、我们在开发中,可能会遇到一个简单的需求:依次读取多个文件的内容
const fs = require('fs')
//先读取出a的内容,再读取b的内容,再读取c的内容
fs.readFile('./files/a.txt', (error, data) => {
console.log(data.toString());
fs.readFile('./files/b.txt', (error, data) => {
console.log(data.toString());
fs.readFile('./files/c.txt', (error, data) => {
console.log(data.toString());
})
})
})
//以上代码会导致出现回调地狱,而promise就是用来解决这种“回调地狱”的
于是就可以使用Promise来解决回调地狱:
//封装一下,将文件路径当做参数传递
function readPromise(path) {
let p = new Promise((reslove, reject) => {
//读取文件
fs.readFile(`./files/${path}.txt`, (error, data) => {
if (error) {
reject(error)
} else {
reslove(data.toString())
}
})
})
return p
}
//调用readPromise方法,依次读取。.then中,返回一个promise实例,可以继续使用下一个 .then来处理
readPromise('a').then((res) => {
console.log(res);
return readPromise('b')
})
.then( res => {
console.log(res);
return readPromise('c')
} )
.then( res => {
console.log(res);
} )
五、.then()和.catch()
- .then():Promise 实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。它的作用是为 Promise 实例添加状态改变时的回调函数。then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数。then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。采用链式的then,可以指定一组按照次序调用的回调函数。
- .catch():用于指定发生错误时的回调函数,如果状态变为resolved,则会调用then方法指定的回调函数;如果异步操作抛出错误,状态就会变为rejected,就会调用catch方法指定的回调函数,处理这个错误。另外,then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获