JavaScript 单线程之异步编程
Js 单线程之异步编程
- 同步模式(Synchronous)
- 异步模式(Asynchronous)
同步模式
console.log('start')
function part1 () {
console.log('loading part1')
}
function part2 () {
console.log('loading part2')
part1()
}
part2()
console.log('end')
// 顺序结果 start --- loading part2 --- loading part1 --- end
// 同时就会触发概念里面那个问题,如果有一个任务耗时特别长,就会出现页面卡死情况,为了避免这种情况,也就有了另一种模式,异步
异步模式
console.log('start')
setTimeout (function timer1 () {
console.log('timer1 invoke')
}, 2000)
setTimeout (function timer2 () {
console.log('timer2 invoke')
setTimeout (function inner () {
console.log('inner')
}, 1000)
}, 1000)
console.log('end')
// 结果 start --- end --- timer2 invoke --- timer1 invoke --- inner
// 同步任务开始执行,碰到计时器丢到任务队列中,同步任务执行完毕,没有微任务,开始执行宏任务,根据倒计时时间,以及里面是否还有其他对应操作,直到结束。
// js 执行引擎先去做完调用栈里面所有的任务,通过事件循环从消息队列中再取出一个任务出来继续执行,以此类推,同时还能随时往消息队列中放入新的任务,排队等待执行,以上就是基本的概念。
回调函数
function foo (callback) {
setTimeout(function () {
callback()
}, 3000)
}
foo(function () {
console.log('这就是一个回调函数')
console.log('调用者定义这个函数,执行者执行这个函数')
console.log('其实就是调用者告诉执行者异步任务结束后应该做什么')
})
// 随之而来,就出现了另一个问题,如果说函数A为回调函数,但是他又接受函数B作为参数,函数B又有一个函数C,这就形成了层层嵌套,就会出现回调地狱。为了解决这个问题,出现了 Promise
Promise
// 基本栗子
const promise = new Promise(function (resolve, reject) {
resolve(200) // 成功
// reject(new Error('rejected')) // 失败
})
// 通过.then 调用
promise.then(function (value) {
console.log('resolved', value)
}, function(error) {
console.log('rejected, error')
})
注释失败代码那一行,结果就是 200成功
注释成功代码那一行,结果就是 失败
- Promise 对象的 then 方法会返回一个全新的 Promise 对象
- 后面的 then 方法就是在为上一个 then 返回的 Promise 注册回调
- 前面 then 方法中回调函数的返回值作为后面 then 方法回调的参数
- 如果回调函数中返回的是 Promise,那后面 then 方法的回调等待它的结束
Promise 静态方法
Promise 并行执行
JavaScript 单线程之异步编程的更多相关文章
- javascript编程单线程之异步模式Asynchronous
异步模式Asynchronous 不会等待这个任务结束才开始执行下一个任务,开启之后立即执行下一个任务,后续逻辑一般会通过回调函数的方式定义,异步模式对js 非常重要,没有异步任务单线程的 js 语言 ...
- javaScript中的异步编程模式
1.事件模型 let button = document.getElementById("my-btn"); button.onclick = function(event) { ...
- javascript中的异步编程
正常情况下js都是顺序执行的,但是也有很多场景下实际上是异步操作: 1.定时器都是异步操作 2.事件绑定都是异步操作 3.AJAX中一般我们都采取异步操作(也可以同步) 4.回调函数可以理解为异步(不 ...
- JavaScript异步编程原理
众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...
- javascript异步编程的前世今生,从onclick到await/async
javascript与异步编程 为了避免资源管理等复杂性的问题, javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为 ...
- 5分种让你了解javascript异步编程的前世今生,从onclick到await/async
javascript与异步编程 为了避免资源管理等复杂性的问题,javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是 ...
- 说一说javascript的异步编程
众所周知javascript是单线程的,它的设计之初是为浏览器设计的GUI编程语言,GUI编程的特性之一是保证UI线程一定不能阻塞,否则体验不佳,甚至界面卡死. 所谓的单线程就是一次只能完成一个任务, ...
- JavaScript 异步编程
博客地址:https://ainyi.com/96 众所周知,JavaScript 是单线程的,但异步在 js 中很常见,那么简单来介绍一下异步编程 同步编程和异步编程 同步编程,计算机一行一行按顺序 ...
- NodeJS的异步编程风格
NodeJS的异步编程风格 http://www.infoq.com/cn/news/2011/09/nodejs-async-code NodeJS运行环境因其支持Javascript语言和异步编程 ...
随机推荐
- pygame.error: video system not initialized
在pygame写游戏出现pygame.error: video system not initialized 源代码 import sysimport pygamedef run_game(): py ...
- ROS的安装-> rosdep init /update报错2022.02.24实测有效
ROS的安装-> rosdep init /update报错2022.02.24实测有效 一. 解决rosdep_init问题 正常执行sudo rosdep init会报错,如下: ERR ...
- mpvue小程序加载不出图片 Failed to load local image resource
我的GitHub博客,很多内容可以看,喜欢的给星星哦 https://github.com/liangfengbo/frontend 第一道:图片引入本地静态文件失效? mpvue开发小程序时候,要添 ...
- JavaScript 中 empty、remove 和 detach的区别
内容 empty.remove 和 detach的区别 jQuery 操作 DOM 之删除节点 方法名 元素所绑定的事件及数据是否也被移除 作用 $(selector).empty() 是 从被选元素 ...
- Mybatis 多表实现多对一查询、添加操作
Mybatis 多表实现多对一查询.添加操作 学习内容: 1. 多对一之添加操作 1.1.需求 1.2.数据库表(多对一或一对多,数据库外键都是设置在多的一方) 1.3.类设计 1.4.Mapper ...
- Android搞定权限申请
0x00 前言 使用EasyPermissions库进行申请权限 打开App时就申请权限,如果用户拒绝权限后,会循环申请 如果永久拒绝后,会跳转到设置里继续申请 效果图: 注:不讲原理,先教你怎么实现 ...
- Servlet 标准下载地址
Servlet 标准下载地址 java 技术标准开发社区 https://jcp.org/ 3.0 https://jcp.org/aboutJava/communityprocess/mrel/js ...
- Python接入企业微信 - 推送信息到内部群里
前言 之前一篇文章提到了使用wechatpy库来实现企业微信应用登录:Django + Taro 前后端分离项目实现企业微信登录 其实这个库可以实现的功能非常多,基本微信开发涉及到的功能都能实现. 本 ...
- ThingsBoard安装编译搭建环境踩坑记录
1.首先从github拉下来项目,我们采用源码编译的方式部署 git clone https://github.com/thingsboard/thingsboard.git 2.切换分支 git c ...
- [ Perl ] 多线程并发编程
https://www.cnblogs.com/yeungchie/ 记录一些常用的 模块 / 方法 . 多线程 使用模块 threads use 5.010; use threads; sub fu ...