• 异步与闭包与fetch


    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     <div class="asd">
     2         <div class="title">
     3             <a href="https://lol.qq.com/data/info-defail.shtml?id=MissFortune">点击直达官方网页</a>
     4             <span>赏金猎人</span>
     5             <span>厄运小姐</span>
     6         </div>
     7         <div class="about">
     8             
     9         </div>
    10         <div class="history">
    11             
    12         </div>
    13         <div class="skill">
    14             <h2>技能介绍</h2>
    15             
    16         </div>
    17         <div class="zhuangbei">
    18             <h2>推荐装备</h2>
    19             
    20         </div>
    21     </div>
    22 
    23 
    24 
    25     <!-- main-modal -->
    26     <div class="template-main">
    27         <div class="mask"></div>
    28         <div class="introuduce">
    29             <h4>${nickname}</h4>
    30             <h1>${name}</h1>
    31             <p><span class="work" >射手</span></p>
    32             <p><span>物理攻击</span>   ${}</p>
    33             <p><span>魔法攻击</span>   ${}</p>
    34             <p><span>防御能力</span>   ${}</p>
    35             <p><span>上手难度</span>   ${}</p>
    36             <div class="down">
    37                 <button>购买英雄</button>
    38             </div>
    39         </div>
    40         <div class="bgm">
    41             <img src="" alt="">
    42         </div>
    43     </div>
    44 
    45     <!-- 背景故事模板 -->
    46     <div class="template-history">
    47         <h2>背景故事</h2>
    48         <div class="story">
    49             <p>${story}</p>
    50         </div>
    51     </div>
    52     
    53     <!-- 模板 -->
    54     <div class="template-skill">
    55         <div class="img"><img src="" alt="" ></div>
    56         <div class="skill-about">
    57             <h3>${skillName}</h3>
    58             <p>${skillOne}</p>
    59             <p>${skillTwo}</p>
    60         </div>
    61     </div>
    62     <!-- class改为template-equ-box -->
    63     <div class="template-equ">
    64         <div class="start">
    65             <h4>${introduce}</h4>
    66             <div class="content">
    67 
    68             </div>
    69         </div>
    70     </div>
    71     <!-- class改为equ-conten -->
    72     <div class="equ-main">
    73         <div class="item">
    74             <div class="item-top">
    75                 <img src="" alt="" >
    76             </div>
    77             <p>${equName}</p>
    78         </div>
    79     </div>
     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.response
    23         //     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             //替换main
    56             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 = templateString
    64 
    65 
    66             //替换故事
    67             templateString = story.replace( '${story}', data.story )
    68             storyBox.innerHTML = templateString
    69 
    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 = templateString
    80                 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 = templateString
    89                 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 = templateString
    95                     ss.appendChild( son )
    96                 }
    97                 equBox.appendChild( ss )
    98             }
    99         }
  • 相关阅读:
    C#生成唯一值的方法汇总
    Ajax && json在springmvc中的使用
    spring集成mybatis
    mybatis iBatis
    springjdbc
    拦截器
    系统分层
    Java反射(reflect)
    springmvc
    spring 之 使用注解简化配置
  • 原文地址:https://www.cnblogs.com/curtain473/p/10049392.html
Copyright © 2020-2023  润新知