2019-05-14 异步

同步:等待结果
异步:不等待结果
// 同步的 sleep
function sleep(seconds){
var start = new Date()
while(new Date() - start < seconds * 1000){
}
return
}
console.log(1)
sleep(3)
console.log('wake up')
console.log(2)

image.png

打开控制台查看代码执行性能的步骤

//异步的 sleep
function sleep(seconds, fn){
setTimeout(fn, seconds * 1000)
}
console.log(1)
sleep(3, ()=> console.log('wake up'))
console.log(2)
结果:
1
2
wake up

可以看出,用了异步之后,JS 的空闲时间,多了许多。
但是注意,在 JS 空闲的这段时间,实际上是浏览器中的计时器在工作(很有可能是每过一段时间检查是否时间到了,具体要看 Chrome 代码)

异步题
document.getElementsByTagNames('img')[0].width // 宽度为 0
console.log('done')

document.getElementsByTagNames('img')[0].width是同步代码,第一次为什么获取到的宽度是0?
原因:因为没有去等异步结果,图片在页面中是需要时间去下载的 img标签是会发请求的
document.getElementsByTagNames('img')[0].onload = function(){
console.log(this.width) // 宽度不为 0
console.log('real done')
}
console.log('done')

题2:
let liList = document.querySelectorAll('li')
for(var i=0; i<liList.length; i++){
liList[i].onclick = function(){
console.log(i)
}
}
结果//点击任何一个都是6
var会变量提升
let liList = document.querySelectorAll('li')
var i
for(i=0; i<liList.length; i++){
liList[i].onclick = function(){
console.log(i)
}
}
onclick是异步的
解决:将var改为let
这里每次的i是不一样的,是个新的i

题3:


image.png

自己定义网络


image.png

image.png

如何拿到异步结果
一般有两种方式拿到异步结果
傻逼方法:轮训
正规方法:回调

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,932评论 2 17
  • 简述JavaScript起源起源于美国的Netscape公司,原名为LiveScript,后改为JavaScrip...
    3ab670b99521阅读 3,098评论 0 0
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,062评论 0 2
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,120评论 1 10
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,879评论 1 45