IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> js里的async/await -> 正文阅读

[JavaScript知识库]js里的async/await

js里的async/await
到底什么是异步编程呢,有什么作用呢?
异步编程允许我们在执行一个长时间的任务的时候,程序是不需要等待的,可以继续执行后面的代码,直到这些任务都完成了之后再回来通知你。
早期的异步编程是通过回调函数来实现的,这种编程的模式避免了程序的阻塞,大大提高了CPU的执行效率,尤其适用于一些前后端数据库交互的操作。然而回调函数会出现回调地狱的情况。
为了解决上面的问题,ES6出现了promise,但是为什么到了ES7,又出现了async/await呢?他与promise对比又有了什么新的优势呢?
(1)什么是async/await
● async/await 是编写异步代码的新方式,是基于promise实现的
● async/await 使得异步代码看起来像同步代码,这就是他的厉害之处。
(2)async
使用async声明一个函数为异步函数

async function fn1(){
return 88;
}
async function fn2(){
return Promise.resolve(66);
}
console.log('return1:',fn1());
console.log('return2:',fn2());

从打印出来的结果,我们可以看出执行一个async函数,返回的都是promise对象,如果返回的是像函数fn1中那样普通的值的话,他会帮你封装成一个promise对象。

(3) await在等什么?
async是用来声明一个函数为异步函数的,那么await又是做什么的呢

async function fn3(){
  const p3=Promise.resolve(66);
  p3.then(data=>{
    console.log('data of then:',data);
  })
  const data =await p3;
  console.log('data of await:',data);
}
fn3();

看了打印的结果后,我们能知道,await等的是结果,promise.then成功的情况对应await,也就是await可以获取Promise函数中的resolve或者reject的值,注意await关键字只能放在async的内部。如果用在普通函数就会出错。
(4)async/await的执行顺序是什么样的呢
await 会让出 线程,阻塞后面的代码,那么async2和script start是哪个先打印的呢?
是从左向右执行,一旦碰到await直接跳出, 阻塞async2()的执行?
还是从右向左,先执行async2后,发现有await关键字,于是让出线程,阻塞代码呢?

async function async1() {
        console.log( 'async1 start' )
        await async2()
        console.log( 'async1 end' )
    }
    async function async2() {
        console.log( 'async2' )
    }
    async1()
    console.log( 'script start' )

详细讲解一下这个的运算
首先同步和异步是怎么运行的
(1)js语句

console.log("11");
console.log("22");
console.log("33");
(2)js函数
function print(s){
  console.log(s)
}
print("11")
print("22")
print("33")

都是按顺序执行的,从上往下,同步执行
(3)用延时器进行,异步执行

function asyncPrint(s){
    setTimeout(()=>{console.log(s)},100)
}
async Print("11")
async Print("22")
async Print("33")
现在也是同步执行的
setTimeout(()=>{console.log(1)},100)
setTimeout(()=>{console.log(2)},200)
setTimeout(()=>{console.log(3)},100)

现在的打印的顺序就是 1  3  2
先是0.1秒打印13,再是0.1秒打印出2
setTimeout()的作用让函数延迟调用,把同步变成了异步
异步执行的时候,并不是代码中的书写顺序,到底是什么时候执行的,取决于他的堵塞
异步函数同时调用的,不会被阻塞
  1. 现在要是想要完成打印出来123,把异步改成改成同步,就要在前一个函数的回调中写下一个函数
f1().then(()=>{
  f2().then(()=>{
    f3()
  })
})

这样就执行完f1()这个异步,再执行f2(),再执行f3()
这样想要很多的异步函数的顺序时,层级会深,不停的用大括号嵌套,用promise和async/await解决,但是await必须用在async函数里

async function doPrint(){
  await f1();
  await f2();
  await f3();
}
下面去看这段代码
   async function async1() {
        console.log( 'async1 start' )
        await async2()
        console.log( 'async1 end' )
    }
    async function async2() {
        console.log( 'async2' )
    }
    async1()
    console.log( 'script start' )

上面的两个function是同步的,执行完async1(),再执行script start,再执行async时阻塞了,此时script start
就插入了,不阻塞就可以正常执行,(从上往下),阻塞的会比不阻塞的快

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:19:29  更:2022-09-21 00:22:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:52:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码