浅谈Promise,async,await

promise的基本用法
首先我们明确pormise是一个对象
第一步我们需要先new一个promise

const promise = new Promise()

promise支持我们传入一个参数

const promise = new Promise(param)

但是请注意这个地方的参数是一个函数,我们先把这个函数用箭头函数的形式写出来

const promise = new Promise(()=>{
	
})

而这个函数又可以接收两个参数,一个是resolve,一个是reject

const promise = new Promise((resolve,reject)=>{
	
})

以上是我们使用promise的第一步
第二步,就是将我们的异步代码写在Promise的函数中,此处我们使用微信小程序的wx.request函数做演示

const promise = new Promise((resolve,reject)=>{
	wx.request({
		success(res){
			...
		}
		fail(error){
			
		}
	})
})

promise有三种状态,第一种是pending(进行中,代表异步的操作正在进行),第二种是fulfilled(已成功,代表异步操作已经执行成功了),第三种是rejected(已失败,代表异步操作执行失败),我们在使用promise的时候这三种状态是如何发生并且发生改变的呢
首先当我们new了一个promise的时候,此时promise已经处在pending中,也就是进行中了,而对于一个处于进行中状态的promise来说它的结果就只有两种,一种是已成功,一种是已失败,那么如何将进行中的promise的状态修改成已成功或者是已失败呢,通过调用resolve,会将状态修改成已成功,调用rejected会将状态修改成已失败。

const promise = new Promise((resolve,reject)=>{
	wx.request({
		success(res){
			resolve(res)
		}
		fail(error){
			reject(error)
		}
	})
})

值得注意的是,一旦这个promise的状态被修改成已成功或者已失败的时候,此时promise的状态就被凝固了,它不可能再被修改成别的状态了,也就是操作时不可逆的。

以上我们就完成了new promise的全过程,接下来我们就可以
通过promise的变量随时取到我们此次异步调用的结果啦。我们使用promise提供的.then方法取到结果

promise.then()

promise的这个方法接收两个回调函数的参数,第一个参数需要传入一个当promise成功时候的回调函数,第二个参数需要传入当promise失败时候的回调函数

promise.then((res)=>{
	
},(error)=>{
	
})

注意:这两个回调函数的顺序是不能颠倒的,第一个必须是成功状态,第二个必须是失败

promise的精髓就在于使用对象的方式保存了异步调用的结果。

promise可以解决异步嵌套的问题
举例:微信小程序中wx.request就是一个异步的函数,需要用回调函数来接收异步调用的结果

wx.request({
  url: 'test.php', //仅为示例,并非真实的接口地址
  success (res) {
    console.log(res.data)
  }
})

success函数就为回调函数,用来接收此次请求成功的结果,假设我们在此次回调函数中继续需要发起新的网络请求,那么毫无疑问,我们继续还需要用一个回调函数来接收调用结果,如果我们还继续需要发起请求呢,就会导致写出下面这样的代码

wx.request({
  url: 'test.php', //仅为示例,并非真实的接口地址
  success (res) {
    wx.request({
		success (res) {
			wx.request({
				success (res){
					wx.request({
						success (res){
							...
						}
					})	
				}
			})
		}
	})
  }
})

这样的代码是不是看起来很复杂,嵌套的结构过于繁琐,这种过多的回调函数的嵌套,有一个专有名词,叫做回调地狱,promise就是可以用来解决这个问题。我们现在定义了三个promise对象

const promise1 = new Promise((resolve,reject)=>{
	wx.request({
		url:'/test1'
		success(res){
			resolve(res)
		}
		fail(error){
			reject(error)
		}
	})
})
const promise2 = new Promise((resolve,reject)=>{
	wx.request({
		url:'/test2'
		success(res){
			resolve(res)
		}
		fail(error){
			reject(error)
		}
	})
})
const promise3 = new Promise((resolve,reject)=>{
	wx.request({
		url:'/test3'
		success(res){
			resolve(res)
		}
		fail(error){
			reject(error)
		}
	})
})

我们想实现的功能是再promise1成功之后调用promise2,promise2成功之后调用promise3,正常情况下我们都会写出这样的代码

promise1.then((res)=>{
	promise2.then((res)=>{
		promise3.then((res)=>{
			
		})
	})
})

但是你会发现这样写好像和回调地狱也没啥差别,所以说这样写才不是真正会用promise,真正用promise写出来的代码是这样的

promise1.then((res)=>{
	return promise2
}).then({res}=>{
	return promise3
}).then((res)=>{
	coonsole.log(res)
})

现在打印出来的res是promise3异步执行的结果,这才是promise的正确用法,这样能让我们每一次异步调用都是平行的关系。但是上述这种仅限于所有涉及到的函数都是异步函数。

接下来说一下async和await(号称异步终结解决方案)
async和await必须搭配在一起使用,否则是会报错
await意义有两个

1.对promise对象求值,比如说某个函数调用的结果返回的是一个promise对象:Promise{‘123’},我们这个时候不想要promise对象而是只想要里面的字符串’123’,那么这时候我们只要在返回结果前面加上await就可以了,但是值得注意的是await并不仅仅只能对promise进行求值,而是可以对任意的表达式都可以进行求值比如说await 100*100,那么结果肯定是10000

2.await可以阻塞当前线程
当await后面调用的是一个异步的函数的时候,这个时候就必须等待异步操作的结果返回之后,才会继续执行下面的代码。这就将难以处理的异步函数的调用变成同步的。

async的意义在于
1.使用了async这个函数的任何的返回值,都会被强制包装成为一个promise对象
2.如果不用async,光用await,代码会报错,所以必须使用,也是相当于捆绑使用吧。

那么async和await怎么搭配promise来使用呢
举个例子

class1.fun1(args1).then((res)=>{
	return res.fun2(args2)
}).then((result)=>{
	console.log(result)
})

这样的一段代码就可以改写成

const res = await class1.fun1(args1)
const result = await res.fun2(args2)
console.log(result)

是不是很简单~

以上就是我个人对promise,asynchronous,await的理解,最近工作没有hin忙,所以可能会多些一些东西~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值