Promise

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) 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值