博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异步与闭包与fetch
阅读量:5280 次
发布时间:2019-06-14

本文共 8833 字,大约阅读时间需要 29 分钟。

js是单线程语言,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。

如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。

JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

具体来说,异步执行的运行机制如下。(同步执行也是如此,因为它可以被视为没有异步任务的异步执行。)

 

闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

 

fetch使用

1 *{ 2             padding: 0px; 3             margin: 0px; 4         } 5         a{ 6             font-size: 18px; 7             color: rgb(0, 0, 0); 8             text-decoration: none; 9             padding: 5px 8px;10             background-color: rgb(218, 230, 226);11             border-radius: 4px;12         }13         .title{14             margin: 40px auto;15             width: 360px;16             display: flex;17             justify-content: center;18             align-items: center;19         }20         .title span{21             margin: 0px 20px;22         }23         .asd{24             max-width: 960px;25             margin: 100px auto;26         }27         .about{28             position: relative;29         }30         .about{31             color: #fff;32         }33         .about .introuduce{34             position: absolute;35             left: 60px;36             top: 70px;37         }38         .about .introuduce p{39             margin: 10px 0px;40         }41         .about .introuduce p span{42             margin-right: 20px;43         }44         button{45             background-color: #4CAF50;46             border: none;47             color: white;48             padding: 10px 15px;49             text-align: center;50             text-decoration: none;51             display: inline-block;52             font-size: 12px;53             margin: 4px 2px;54             cursor: pointer;55         }56         .about .mask{57             width: 200px;58             height: 100%;59             left: 0px;60             top: 0px;61             position: absolute;62             background-color: rgba(0, 0, 0, .5);63         }64         .work{65             padding: 4px 8px;66             border: 1px solid rgb(255, 126, 40);67             background: rgb(255, 126, 40);68             border-radius: 6px;69         }70         .history{71             margin: 20px 0px;72         }73         .template{74             display: flex;75             margin: 20px 0px;76         }77         .template .img{78             margin-right: 20px;79         }80         h2{81             font-size: 20px;82             margin: 10px 0px;83         }84         h4{85             margin: 8px 0px;86             font-size: 14px;87         }88         .template-skill, .template-equ, .equ-main, .template-main, .template-history{89             display: none;90         }91 92 93         .equ-item{94             display: inline-block;95             width: 110px;96             text-align: center;97         }
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

${nickname}

30

${name}

31

射手

32

物理攻击 ${}

33

魔法攻击 ${}

34

防御能力 ${}

35

上手难度 ${}

36
37
38
39
40
41
42
43
44 45
46
47

背景故事

48
49

${story}

50
51
52 53
54
55
56
57

${skillName}

58

${skillOne}

59

${skillTwo}

60
61
62
63
64
65

${introduce}

66
67 68
69
70
71
72
73
74
75
76
77

${equName}

78
79

 

1 var temMain = document.getElementsByClassName('template-main')[0].innerHTML 2         var story = document.getElementsByClassName('template-history')[0].innerHTML 3         var skill = document.getElementsByClassName('template-skill')[0].innerHTML 4         var equTemp = document.getElementsByClassName('template-equ')[0].innerHTML 5         var itemEqu = document.getElementsByClassName('equ-main')[0].innerHTML 6  7         var mainBox = document.getElementsByClassName('about')[0] 8         var storyBox = document.getElementsByClassName('history')[0] 9         var skillBox = document.getElementsByClassName('skill')[0]10         var equBox = document.getElementsByClassName('zhuangbei')[0]11 12 13         var templateString = ""14 15 16         // var asd = new XMLHttpRequest()17         var reqUrl = "https://curtaintan.github.io/tan/a.json"18         // asd.open( 'GET', reqUrl, true )19         // asd.responseType = 'json'20         // asd.send()21         // asd.onload = function(){
22 // var res = asd.response23 // console.log(res)24 // show( res )25 // }26 27 28 29 fetch( reqUrl ).then( res => {30 return handleResponse( res )31 }).then( res => {32 console.log( res )33 show( res )34 } )35 36 37 38 //返回数据类型转换39 function handleResponse( res ){40 let contentType = res.headers.get('content-type')41 console.log( contentType )42 if( contentType.includes('application/json' ) ){ //json格式43 console.log('-------------数据是json---------------')44 return res.json()45 }else if( contentType.includes('application/json' )){ //xml和文本格式46 console.log('-------------数据不是json---------------')47 return res.text()48 }49 }50 51 52 53 54 function show ( data ){55 //替换main56 templateString = temMain.replace("${nickname}", data.nickName)57 .replace("${name}", data.name)58 .replace('src=""', 'src="'+ data.headImg +'"')59 .replace('${}', data.attr.物理攻击 )60 .replace('${}', data.attr.魔法攻击 )61 .replace('${}', data.attr.防御能力 )62 .replace('${}', data.attr.上手难度 )63 mainBox.innerHTML = templateString64 65 66 //替换故事67 templateString = story.replace( '${story}', data.story )68 storyBox.innerHTML = templateString69 70 71 //替换技能72 for( let i = 0; i < data.skill.length; i ++ ){73 templateString = skill.replace( 'src=""', 'src="'+ data.skill[i].image +'"' )74 .replace( '${skillName}', data.skill[i].name )75 .replace( '${skillOne}', data.skill[i].introduce)76 .replace( '${skillTwo}', data.skill[i].twointroduce)77 let ss = document.createElement('div')78 ss.classList.add('template')79 ss.innerHTML = templateString80 skillBox.appendChild( ss )81 }82 83 84 //替换装备85 for( let i = 0; i < data.equipment.length; i ++ ){86 templateString = equTemp.replace( "${introduce}", data.equipment[i].introduce )87 let ss = document.createElement('div')88 ss.innerHTML = templateString89 for( let j = 0; j < data.equipment[i].equ.length; j ++ ){90 templateString = itemEqu.replace('${equName}', data.equipment[i].equ[j].name)91 .replace( 'src=""', 'src="'+ data.equipment[i].equ[j].image +'"' )92 var son = document.createElement('div')93 son.classList.add('equ-item')94 son.innerHTML = templateString95 ss.appendChild( son )96 }97 equBox.appendChild( ss )98 }99 }

 

转载于:https://www.cnblogs.com/curtain473/p/10049392.html

你可能感兴趣的文章
HashMap循环遍历方式
查看>>
React Native 入门 调试项目
查看>>
C# 通过 Quartz .NET 实现 schedule job 的处理
查看>>
关于java之socket输入流输出流可否放在不同的线程里进行处理
查看>>
目前为止用过的最好的Json互转工具类ConvertJson
查看>>
Day13
查看>>
tensorflow saver简介+Demo with linear-model
查看>>
Luogu_4103 [HEOI2014]大工程
查看>>
Oracle——SQL基础
查看>>
项目置顶随笔
查看>>
Redis的安装与使用
查看>>
P1970 花匠
查看>>
java语言与java技术
查看>>
NOIP2016提高A组五校联考2总结
查看>>
iOS 项目的编译速度提高
查看>>
table中checkbox选择多行
查看>>
Magento开发文档(三):Magento控制器
查看>>
性能调优攻略
查看>>
ie6解决png图片透明问题
查看>>
瞬间的永恒
查看>>