Promise以及async/await

一、异步编程

谈到Promise不得不说这个异步编程的概念,还有涉及到的回调地狱。在JavaScript中API分为同步API和异步API,那么什么是同步API,什么又是异步API呢?

一、同步API

同步API:只有当前API执行完成后,才能执行下一个API。JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。平常我们写的一般JavaScript的代码是按顺序执行的,这就是同步API。

二、异步API

异步API:当前API的执行不会阻塞后续代码的执行。异步API是一个耗时操作,比如说发送请求,文件读取,定时器的回调,DOM的事件处理函数等等。 JavaScript的异步是通过回调函数实现的,即通过任务队列,在主线程执行完当前的任务栈(所有的同步操作),主线程空闲后轮询任务队列,并将任务队列中的任务(回调函数)取出来执行。“回调函数”(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。其他更详细的异步API信息可以自行了解JS的事件循环(Event Loop)机制。

三、同步API与异步API的区别

  • 1、同步API可以从返回值(使用return)中拿到API的执行结果,但是异步API是不可以的。比如说定时器当中的函数的返回值是不可以直接拿到的。异步API的值是通过回调函数拿到的。不能在定时器的回调函数中使用return将返回值返回,只能在调用回调函数时的实参当中。
    演示定时器中的异步API返回值的获取:
function fn(callback){
	 //定时器的回调是异步API,只能通过回调函数才能将值返回,不能使用return
	 setTimeout(function(){
	     callback({
	         msg:'我是返回值'
	     },1000)
	 })
}
// 调用函数时,必须传递回调,回调的形参即是异步API的返回值
fn(function(data){
 	console.log(data)
})
  • 2、代码执行顺序的不同
    同步API从上到下依次执行,前面代码会阻塞后面代码的执行。
    异步API不会等待API的执行完成再向下执行代码。
    代码的执行顺序:在执行代码时,将同步任务放在同步代码执行区,异步任务放在异步代码执行区,将异步任务的回调函数放在回调函数队列,当同步代码执行完毕之后,再去执行异步任务的回调函数。

二、回调地狱与Promise

  • 1、回调地狱现象的出现:异步API的回调函数执行了,就代表异步任务执行完毕,可以拿到返回值了,如果我们想按顺序实行多个异步任务,那么就将第二个异步任务放在第一个异步任务的回调函数当中,如果任务有多个,那么就是一个回调函数嵌套着一个回调函数,这种现象就叫做回调地狱
  • 2、ES6回调地狱的解决:promise:Promise是一个构造函数,使多个异步函数依次执行。这个对象可以使用then方法获取返回值,then方法的参数是回调函数,返回值在回调函数的形参中。.
  • 3、Promise语法:let promise = new promise((resolve,reject)=>{
    放置异步任务:定时器和文件读取等。
    resolve是将返回值返回给外部,
    reject是将失败信息返回给外部。这两个参数就是两个回调函数。
    })
  • 4.使用示例:
    在这里插入图片描述

三、ES7中的async/await

自从promise出现之后,回调地狱的问题是解决了,但是可以从上面的示例中看到,代码结构依旧臃肿,依旧存在嵌套。ES7中的async/await就是来解决上面的代码臃肿问题的,async/await也称之为异步函数。非常推荐使用!!!
需要注意以下几点:

  • 1、在普通函数定义前加上async关键字。
    在这里插入图片描述
  • 2、异步函数的默认返回值就是promise对象
  • 3、返回值可以在异步函数内部使用return返回,在外部还是使用then获取。错误信息使用throw抛出,还是使用catch获取。但是在异步函数内部抛出错误信息之后,后面的代码将不再执行。
  • 4、await关键字:只能出现在异步函数中,这个关键字后面只能跟promise对象,可以暂停异步函数的执行,等待promise对象返回结果后再向下执行函数。用来决定异步函数的执行顺序。
    使用示例1:
    在这里插入图片描述
    使用示例2:
// 发送异步请求,获取数据
async getTableInfo(){
	const {data:res} = await this.axios.get("你的url")
	this.tableData= res.data
}

函数名前加上async之后才可以才函数内部使用await关键字,await后面必须跟的是promise对象,而axios是基于promise的。加上await之后会等待当前请求返回结果获取到之后,也就是先拿到data,再向下执行this.tableData= res.data。

猜你喜欢

转载自blog.csdn.net/weixin_43242112/article/details/106963585