这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
一、单线程
1.javascript是单线程语言,只能同时做一件事,代码从上往下执行,一个个加载。
2.javascript和DOM渲染共用一个浏览器线程,即两者只能同时进行一个,这是为了保证不会出现两者同时对一个元素做操作。
3.浏览器和node.js已经支持javascript启动进程,例如WebWorker。
二、callback
1.callback即是回调函数,是来处理异步的,至于为什么会出现异步的情况,是因为js单线程很可能导致我们加载某些内容的时候等待时间过长卡住。
2.callback本身不足,很容易引起回调地狱,不仅阅读困难,也很难去维护这些代码。
三、应用场景
1.同步和异步的区别:同步会阻塞代码的执行,异步不会阻塞代码的执行。
2.发送网络请求的时候例如请求一些资源(图片等等)。
3.出现定时任务的时候如setTimeout和setInterval。
四、Promise
1.为了解决使用callback产生的回调地狱,promise采用了并行的书写方式,区别于callback的嵌套方式。
2.关于具体如何使用promise,我们给出一个手写promise加载图片的函数熟悉一下:
function loadImage(src) { // 定义promise加载图片的方法
const p = new Promise((resolve, reject)=>{ // 将整个promise赋值给一个变量,方便后面直接返回变量
const img = document.createElement('img')
img.src = src // 在DOM创建一个img标签并且指定图片地址为我们的传入的地址
img.onload=()=>{
resolve(img)
} // 图片成功加载则触发resolve状态,并且返回img标签(带地址),调用者用.then接收
img.onError=()=>{
const err = `图片加载失败${src}`
reject(err)
} // 图片加载失败则触发reject,并且把错误信息传回去,调用者用.catch接收
})
return p // 返回变量
}
const url1 = 'https://www.3dmgame.com/uploads/images/thumbztfirst/20180824/1535097139_983975.jpg'
const url2 = 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3719520752,2657134858&fm=26&gp=0.jpg'
loadImage(url1) // 调用我们定义的方法
.then((img)=>{
console.log(img.width);
return img // 成功加载第一张图片时打印其宽并且返回img标签,方便下一个then使用
})
.then((img)=>{
console.log(img.width);
return loadImage(url2) // 这里调用我们定义的方法,准备加载第二张图片
})
.then((img)=>{
console.log(img.width);
return img
})
.then((img)=>{
console.log(img.height);
})
.catch((err)=>{
console.log(err);
})