# 异步和单线程
# Content
- 单线程和异步
- 应用场景
- callback hell 和 Promise
# 单线程和异步
- JS 是单线程语言,只能同时做一件事儿
- 浏览器和nodejs已支持JS启动进程,如Web Worker
- JS 和 DOM 渲染共用同一个进程,因为 JS 可修改DOM 结构
- 遇到等待(网络请求、定时任务)不能卡住
- 需要异步
- 回调callback 形式
// 同步
console.log1(100)
alert(200)
console.log(300)
// 异步
console.log(100)
setTimeout(function() {
console.log(200)
}, 1000)
console.log(300)
# 异步和同步
- 基于JS 是单线程语言
- 异步不会阻塞代码执行
- 同步会阻塞代码执行
# 应用场景
网络请求,如ajax 图片加载
// 图片加载 console.log('start') let img = document.createElement('img') img.onload = function() { console.log('loaded') } img.src = 'xx.png' console.log('end')
定时任务,如setTimeout
# Promise
解决 callback hell
# 相关题目
同步和异步的区别是什么?
- 基于JS 是单线程语言
- 异步不会阻塞代码执行
- 同步会阻塞代码执行
手写用Promise 加载一张图片
function loadImg(src) { return new Promise( (resolve, reject) => { const img = document.createElement('img') img.onload = () => { resolve(img) } img.onerror = () => { reject(new Error(`图片加载失败 ${src}`)) } img.src = src } ) }
前端使用异步的场景有哪些?
场景题
// setTimeout console.log(1) setTimeout(function() { console.log(2) }, 1000) console.log(3) setTimeout(function() { console.log(4) }, 0) console.log(5) // 1, 3, 5, 4, 2
← 作用域和闭包 Event Loop →