异步题

作者: _William_Zhang | 来源:发表于2018-09-25 10:53 被阅读1次

    前端经常遇到的异步

    图片加载需要时间
    document.getElementsByTagName('img')[0].width // 宽度为 0
    console.log('done')
    
    document.getElementsByTagName('img')[0].onload = function(){
        console.log(this.width) // 宽度不为 0
        console.log('real done')
    }
    console.log('done')
    

    面试题中的异步

    let liList = document.querySelectorAll('li')
    for(var i=0; i<liList.length; i++){
        liList[i].onclick = function(){
            console.log(i)
        }
    }
    
    上面用 var 代码的时序图,理解异步

    把 var i 改成 let 就可以破解

    let liList = document.querySelectorAll('li')
    for(let i=0; i<liList.length; i++){
        liList[i].onclick = function(){
            console.log(i)
        }
    }
    

    AJAX 中的异步

    同步的:

    let request = $.ajax({
      url: '.',
      async: false
    })
    console.log(request.responseText)
    

    异步的:

    $.ajax({
        url: '/',
        async: true,
        success: function(responseText){
            console.log(responseText)
        }
    })
    

    异步的形式

    一般有两种方式拿到异步结果

    • 傻逼方法:轮询
    • 正规方法:回调

    回调的形式

    Node.js 的 error-first 形式
     fs.readFile('./1.txt', (error, content)=>{
         if(error){
             // 失败
         }else{
             // 成功
         }
     })
    
    jQuery 的 success / error 形式
     $.ajax({
         url:'/xxx',
         success:()=>{},
         error: ()=>{}
     })
    
    jQuery 的 done / fail / always 形式
     $.ajax({
         url:'/xxx',
     }).done( ()=>{} ).fail( ()=>{} ).always( ()=> {})
    
    Prosmise 的 then 形式
     $.ajax({
         url:'/xxx',
     }).then( ()=>{}, ()=>{} ).then( ()=>{})
    

    相关文章

      网友评论

          本文标题:异步题

          本文链接:https://www.haomeiwen.com/subject/lwjkoftx.html