异步题

前端经常遇到的异步

图片加载需要时间
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( ()=>{})
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容