Ashun's 技術駅 Ashun's 技術駅
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • Vue
  • 现代web布局
  • React
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 技术资源
  • 第一阶段

    • HTML
  • 第二阶段

    • JavaScript
  • 第三阶段

    • Vue
  • 第四阶段

    • 实战项目
  • 每周测试

    • 每周
  • 其他

    • Vue引入UI框架
    • Web前端面试
    • Vue3-resource
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 福利资源
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Ashun

前端界的小学生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • Vue
  • 现代web布局
  • React
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 技术资源
  • 第一阶段

    • HTML
  • 第二阶段

    • JavaScript
  • 第三阶段

    • Vue
  • 第四阶段

    • 实战项目
  • 每周测试

    • 每周
  • 其他

    • Vue引入UI框架
    • Web前端面试
    • Vue3-resource
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 福利资源
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 01变量-es6
  • 02常量-es6
  • 03解构赋值-es6
  • 04字符串拓展-es6
  • 05数字拓展-es6
  • 06数组拓展-es6
  • 07函数拓展-es6
  • 08对象拓展-es6
  • 09类拓展-es6
  • 10扩展运算符-es6
  • 11set数据结构-es6
  • 12map数据结构-es6
  • 13同步和异步-es6
    • 一、同步任务和异步任务
    • 二、异步函数
    • 三、异步函数-promise
      • 1)使用promise
      • 2、案例
      • 3、promise带来的问题-回调地狱
    • 四、async await
  • 《es6》
ashun
2022-02-14
目录

13同步和异步-es6

# 同步和异步

js是单线程语言,代码的执行顺序是由上往下执行的

//先执行打印1,再执行打印2
console.log(1)
console.log(2)
1
2
3

%accordion% 历史解说 %accordion%

线程和进程

js是单线程语言
单位时间内只能做一件事

单线程 异步执行 提高效率 阻塞
双线程 同步执行

执行栈 ——备选中 先保存 在做考虑


new Promise() 异步函数,把异步变成同步
async await() 异步函数


回调函数
promise
async await


前后端分离

前端    请求/响应   后端
列表
渲染页面

promise 需要通过回调函数获取值,asyncawait不需要
        promise有回调地狱
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

%/accordion%

# 一、同步任务和异步任务

因为js是单线程的原因,如果执行完计时器再执行其他代码,那么会造成阻塞。

所以js会把需要消耗时间的操作都分类为异步任务,不需要消耗时间的分为同步任务。

js会把异步任务分配到任务队列里面,而同步任务分配到主线程里面,先执行完主线程的任务再执行任务队列的任务。

//先执行打印2,隔2秒后再执行打印1
setTimeout(()=>{
  console.log(1)
},2000)

console.log(2)
1
2
3
4
5
6

%accordion% 练习🚀 %accordion%

//先打印2再隔一秒打印1
setTimeout(function () {
    console.log(2); //2
}, 1000)
console.log(1); //1


function fn(f) {
    f(1)
}
fn(function (val) {//调用fn
    console.log(val);//1
})
1
2
3
4
5
6
7
8
9
10
11
12
13

%/accordion%

# 二、异步函数

异步函数是把异步任务变成同步任务执行。

//这种写法就是先等待2秒后执行1,然后再执行2。
function a(){
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      console.log(1)
      resolve()
    },2000)
  })
}

a().then(()=>{
  console.log(2)
})
1
2
3
4
5
6
7
8
9
10
11
12
13

%accordion% 练习🚀%accordion%

// 先执行2在执行1 隔得1秒
function fn(f) {
    setTimeout(function () {
        console.log(2);
        f()
    }, 1000)
}
fn(function () {
    console.log(1);
})
1
2
3
4
5
6
7
8
9
10

%/accordion%

# 三、异步函数-promise

# 1)使用promise

//promise对象里面提供了一个resolve回调和reject回调,分别代表成功和失败
let bool = false
let p = new Promise((resolve,reject)=>{
  if(bool){
    resolve()
  }else{
    reject()
  }
})

//成功后用.then()的方式获取成功的回调,.catch()获取失败回调
p.then(()=>{
  console.log(123)
}).catch(()=>{
  console.log(456)
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

%accordion% 练习🚀 %accordion%

成功执行的2然后就执行1,失败就凉了
function fn() {
    return new Promise((resolve) => {
        setTimeout(function () {
            console.log(2);//2
            resolve()
        }, 1000)
    })
}

fn().then(function () {
    console.log(1);//1
})

new Promise((resolve,reject)=>{
    resolve()//成功的
    reject()//失败的
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

%/accordion%

# 2、案例

//这个案例实现了把异步任务变成同步任务执行
function a(){
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      console.log(1)
      resolve()
    },2000)
  })
}

a().then(()=>{
  console.log(2)
})
1
2
3
4
5
6
7
8
9
10
11
12
13

# 3、promise带来的问题-回调地狱

//promise会带来一个问题,称为回调地狱,无法从then的外面获取值,而且不美观
function a(){
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      resolve(1)
    },2000)
  })
}

a().then((res)=>{
  console.log(res)//1
})
1
2
3
4
5
6
7
8
9
10
11
12

# 四、async await

//async await 就是用来解决promise产生的回调地狱的问题
function a(){
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      resolve(1)
    },2000)
  })
}

async function fn(){
  let x = await a()
  console.log(x)//1
}

fn()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

[!cogs]

// new Promise() 异步函数,把异步变成同步
// async await() 异步函数
function fn1() {
    return new Promise((resolve) => {
        setTimeout(function () {
            console.log(1);
            resolve()
        }, 1000)
    })
}


function fn2() {
    return new Promise((resolve) => {
        setTimeout(function () {
            console.log(2);
            resolve()
        }, 1000)
    })
}


function fn3() {
    return new Promise((resolve) => {
        setTimeout(function () {
            console.log(3);
            resolve()
        }, 1000)
    })
}

/——仅参考
// fn1().then(() => {
//     fn2().then(() => {
//         fn3().then(() => {
//             console.log(4);
//         })
//     })
// })


async function f() {
    await fn1() //1
    await fn2() //2
    await fn3() //3
    console.log(4); //4
}
f()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
编辑 (opens new window)
上次更新: 2022/04/24, 13:33:34
12map数据结构-es6

← 12map数据结构-es6

最近更新
01
课件-react路由-V6
01-22
02
课件-国际化
01-22
03
课件-redux-toolkit
01-22
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式