ES6 Promise的学习
Promise是ES6引入的异步编程的心解决方案,语法上Promise 是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。
Promiese可以避免回调地狱的问题、Promise对象提供了简洁的API、使得控制异步操作更加容易
下面让我由浅入深的了解Promise
Promise是有三种状态 :
- pendding 初始状态
- fulfill 成功
- reject 失败
他们直接的转换是不可逆的,例如 pendding 变成 resolve 成功 ,就不能再变成pendding 或者 reject
Promise的书写
// 当我创建Promise实例的时候,需要传入一个回调(callback)这里我采用的是箭头函数的写法,回调里面可以接收两个参数resolve和reject
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
// 这里我们模拟请求后拿到返回的数据
let data = "我拿到后端小哥返回的数据了"
// resolve ("请求失败了")
resolve(data) // 从这个串代码我们可以分析出 resolve是一个函数,他可以改变Promise的状态,比如这个就是讲pendding状态改成resolved
},1000)
})
console.log(p) //
then方法的用法
let p = new Promise((resolve,reject)=>{
setTimeout(() => {
let data = "我拿到后端小哥返回的数据了"
resolve(data)
},1000)
})
// 当 Promise实例处于成功状态时就会走.then中第一个回调,失败走第二个回调
p.then(
(response)=>{
console.log(response)
}
(error)=>{
console.error(error)
}
)
// then方法的链式调用例子
p.then(
response=>{
// 可以执行异步操作
},
error=>{
console.error(error)
}
)
.then(
response=>{
// 可以执行异步操作
},
error=>{
})
Promise在node环境下读取文件
/*
├── promisp
├── index.js
└── 饮酒.txt
*/
let fs = require("fs")
let p = new Promise((reslove,reject)=>{
fs.readFile("./饮酒.txt",(err,data)=>{
if(err) reject(err)
reslove(data)
})
})
p.then(
response => {
console.log(response.toString()) // 返回的是Buffer 需要用toString() 转成文件
},
error =>{
console.log(error.message)
}
)
// node index.js
.then 方法的返回值
let p = new Promise((resolve,reject)=>{
setTimeout(() => {
let data = "我拿到后端小哥返回的数据了"
resolve(data)
},1000)
})
// 调用then方法,then方法返回值是Promise对象,对象的状态是有then方法执行的回调结果决定的
let result = p.then(
(response) =>{
/*
返回非Promise对象 例如: 字符串, 则p的桩体就是成功resolve 成功的值就是ok
return "ok"
返回Promise对象 例如
return new Promise((resolve,reject)=>{
resolve("ok") // 则p的桩体就是成功resolve 成功的值就是ok
reject("失败了") // 则p的桩体就是成功rreject 失败的值就是ok
})
抛出错误
throw new Error("出错了")
// 则p的桩体就是成功rreject 失败的值就是ok
*/
console.log(response)
}
(error)=>{
console.error(error)
}
)
.catch 方法
let p = new Promise((resolve,reject)=>{
setTimeout(() => {
let data = "我拿到后端小哥返回的数据了"
resolve(data)
},1000)
})
// 当then方法不指定第二个回调的时候就可以使用catch方法来处理错误的回调,下面让我们来演示一下写法
p.then(
resolve=>{
console.log(resolve)
}
).catch(
error=>{
console.log(error)
}
)
Promise Api 的介绍
/*
Promise.resolve 方法介绍, 可以快速的得到一个成功或失败Promise的对象
1、如果传入的参数为 非Promise类型的对象,则返回的结果为成功Promise对象
2、如果传入为Promise对象,则参数的结果决定了 p 的结果
*/
let p = Promise.resolve(value)
/*
Promise.reject 方法介绍,可以快速的得到一个失败的Promise的对象
无论传入什么返回永远都是失败的Promise对象
*/
let p = Promise.reject(value)
/*
Promise.all()方法介绍
传入一个数组,返回一个promise对象
如果传入的数组每个元素都是成功的状态,则p的状态为成功,成功结果为数组每个元素的成果结果的数组
如果传入的数组中有个元素是失败状态,则p的状态为失败,失败的结果就是,每个失败的结果组成的数组
*/
let p = Promise.all(arr)
/*
Promise.race()方法介绍
传入一个Promise对象的数组,返回一个promise对象
谁的状态先发生改变,则p的结果和状态就就是那个Prmise对象的状态
*/
let p = Promise.all(race)