同步和异步

一、javascript中为什么需要引入异步?

   1.我们知道js是单线程语言,只能同时做一件事。但在遇到需要等待(网络请求,定时任务)不能卡住,所以引入了异步

   2.异步就是为了解决单线程需要等待的问题(如:网络请求,定时任务)

 3.异步是基于回调 callback 函数形式 

二、同步和异步

1.异步:不会阻塞代码执行,

//异步
console.log(100)
setTimeout(()=>{ // 回调函数
    console.log(200)
},1000)
console.log(300)

 代码依次输出: 100  、300 、200

2.同步:会阻塞代码执行,上一行代码没执行完不会往下执行

//同步
console.log(100)
alert(200)
console.log(300)

alert 弹窗不关闭,下一行代码不会执行

三、异步应用场景

  1.网络请求,如:ajax、图片加载

//ajax
console.log('start')
$.get('./data1.json',function(data1){
      console.log(data1)
})
console.log('end')
//图片加载
console.log('start')
let img = document.createElement('img')
img.onload = function(){
      console.log('loaded')
}
img.src = '/xxx.png'
console.log('end')

  2. 定时任务,如setTimeout、setInterval

//setTimout
console.log(100)
setTimeout(function(){
      console.log(200)
},1000)
console.log(300)
//setInterval
console.log(100)
setInterval(function(){
     console.log(200)
},1000)
console.log(300)

 四、手写一个用Promise 加载图片

            function loadImg(src){
                return new Promise((resolve,reject)=>{
                    const img = document.createElement('img')
                    img.onload = function(){
                        console.log(img,this)
                        resolve(img)
                    }
                    img.onerror = function(){
                        const error = new Error(`图片加载失败 ${src}`)
                        reject(error)
                    }
                    img.src = src
                   
                })
            }

           // 测试例子

            const url = 'https://assets.cnblogs.com/logo.svg'
            const url2 = 'https://assets.cnblogs.com/logo.svg'
            loadImg(url).then(res=>{
                console.log(res.width) // 150
                return res // 将普通对象做为参数传给下一个then
            }).then(res =>{
                console.log(res.height) //55
                return loadImg(url2) //promise实例,则将promise实例的resolve()返回的参数 做为下一个then函数的参数
            }).then((img2)=>{
                console.log(img2,'uuu')
            }).catch(err =>{
                console.log(err)
            })

 

posted @ 2024-11-16 21:05  yangkangkang  阅读(3)  评论(0编辑  收藏  举报