异步

什么是单线程,和异步的关系

 1 单线程----只有一个线程,只能做一件事情
 2 原因--避免DOM渲染的冲突
 3 解决方案--异步
//循环运行期间,JS执行和DOM渲染暂时卡顿
var  i,sum = 0;
for( i = 0;i<100000000;i++) {
    sum+=i;
 }
 console.log(sum);


// alert  不处理,JS执行和DOM渲染时卡顿
console.log(1)
alert('hello')
console.log(2)

原因-避免DOM渲染冲突

1 浏览器需要渲染DOM
2 JS可以修改DOM结构
3 JS执行的时候,浏览器DOM渲染会暂停
4 两段JS也不能同时执行(都修改DOM就会冲突)
5 JS本身也是单线程的
6 webworker支持多线程,但是不能访问DOM

解决单线程的方法—异步

console.log(100)
setTimeout(function(){
    console.log(200)  //反正 1000ms之后执行
 },1000) //先不管它,先让其他Js代码运行,其他代码执行后在执行
 console.log(300)
 console.log(400)
 100   300 400 200

ajax-异步

console.log(100)
$.ajax ({
     url:'xxxxxxx',
     success:function(result) {   //ajax加载完才执行
         console.log(result)   //先不管它,先让JS代码运行
      }
 })
console.log(300)
console.log(400)
//先把该执行的执行完了,异步最后在执行

解决方案–异步

1 单线程就是同时只能做一件事,两段JS不能同时执行
2 原因就是避免DOM渲染的冲突
3 异步是一种“无奈”的解决方案,虽然有很多问题

什么是event-loop(重点)

1 事件轮询或事件循环  JS实现异步的具体解决方案
2  同步代码,直接执行
3 异步函数先放在异步队列中
4 待同步函数执行完毕,轮询执行 异步队列的函数

实例分析

setTimeout(function () {
    console.log(100)
 })
 console.log(200)

//主进程
console.log(200)

//异步队列
function() { 
   console.log(100)
 }












setTimeout(function () {
    console.log(1)
 },100)
 setTimeout(function () {
     console.lo(2)
  } )
  console.log(3)

//主进程
console.log(3)
//异步队列
//立即被执行
functin () {
    console.log(2)
 }
// 100s 之后被放入
function () {
    console.log(1)
 }

知识串联

1 单线程--同一时间只能做一件事情
2 原因-避免DOM渲染冲突
3 解决方案---异步
4 实现方法----event  loop

回顾

1 事件轮询,JS实现异步的具体解决方案
2 同步代码,直接执行
3 异步函数先放在异步队列中
4 待同步函数执行完毕,轮询执行,异步队列的函数

是否用过jQuery的Deferred

1 jQuery1.5的变化
2 使用jQuery Deferred

jQery1.5的变化

var   ajax = $.ajax({
  url:'data.json',
  success:function () {
       console.log('success1')
       console.log('success2')
       console.log('success3')
   },
   error:function() {
       console.log('error')
    }
 })
console.log(ajax)  //返回一个XHM对象



//很像Promise的写法
var  ajax  =  $.ajax('data.json')
ajax.then(function(){
      console.log('success 1')
 },function () {
      console.log('error 1')
  })
  .then(function () {
     console.log('success 2')
   },function () {
       console.log('error 2')
    })
1 无法改变JS异步和单线程的本质
2 只能从写法上杜绝callback这种样式
3 他是一种语法糖形式,但是解耦了代码
4 很好的体现:开放封闭原则

使用jQuery Deferred


// 给出一段非常简单的异步操作代码,使用setTimeout函数
var   wait = function () {
     var task function () {
         console.log('执行完成')
      }
      setTimeout(task,2000)
 }
 wait()
//新增需求:要在执行之后进行某些特别复杂的操作,代码可能会很多,而且分好几个步骤

使用jQuery Deferred

 function waitHandle() {
     var  dtd = $.Deferred()
     
      var  wait =  function  (dtd) {
          var task = function () { 
                console.log('软件完成')
           }
       }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值