理解JavaScript的异步一

1.JS是单线程的语言。

2.实现异步的最核心原理,就是将callback作为参数传递给异步执行的函数。当有结果返回之后再触发callback执行。

3.常用的异步操作:

网络请求:如AJAX,http.get

IO操作:如readFile,readdir

定时函数:如setTimeout,setInterval;

4.事件绑定与异步的比较:

相同之处:技术实现上基本相同,执行方式基本相同,通过Event-loop执行;

不同之处:异步操作是系统自动调用,而事件绑定需要触发。事件绑定有明显的“订阅-发布”设计模式;

5.Event-loop

①event-loop是一个程序结构,用于等待和发送消息和事件;

②就是在程序中设置两个线程:一个负责程序本身的运行,称为“主线程”;另一个负责主线程与其他进程之间的通信,称为“event-loop线程”,也叫消息线程;

③异步执行的运行机制:

A:所有同步任务都在主线程上执行,形成一个执行栈;

B:主线程外,存在一个“任务队列”,只要异步任务有了运行结果,就在任务队列中放置一个事件;

C:当所有同步任务执行完毕,读取任务队列事件,进入执行栈,开始执行;

D:主线程不断重复C步骤;

④任务队列是个先进先出的数据结构,排在前面的事件优先被主线程读取;执行栈中的代码(同步任务),总是在读取任务队列(异步任务)之前执行;

6. jQueryv1.5之前,AJAX返回一个XHR对象,该对象没有done和fail方法;v1.5之后,AJAX返回一个deferred对象,该对象有done和fail方法,且是请求返回之后再去调用。then函数可以代替done和fail函数,then函数的第一个参数㐊成功之后执行的函数(即done),第二个参数是失败之后执行的函数(即fail),而且then函数还可以链式连接。

7.deferrd对象具有的函数属性:

resolve和reject:主动触发用来改变状态;

then、done和fail:状态变化之后才会触发的监听函数;

8.promise对象相比于deferred对象,缺少了resolve和reject这两个函数属性,只能被动监听变化(then函数),不能主动修改操作。可以同时使用deferred对象和promise对象实现主动和被动的分离;

function func(){
    var def= $.Deferred();
    setTimeout(function(){def.resolve();},2000);
    return def.promise;
}

9.ES6中的promise实在jQuery1.5发布若干年之后才出现在ES6标准中的;用promise封装一段异步代码如下:

const wait= function(){
    const promise=new Promise((resolve,reject)=>{
        setTimeout(function(){resolve();},2000);
        })
    return promise;
}

将异步操作的代码用new Promise((resolve,reject)=>{异步代码})封装起来,在异步操作的内部,执行resolve或者reject,表明异步操作成功或者失败。

10.promise对象有then方法,接收两个参数(函数),第一个在成功时触发执行,第二个在失败时触发执行。then可以进行链式操作。

11.promise的参数传递和异常捕获:

①执行resolve传递的值会被第一个then处理时接收到,如果then有链式操作,前面步骤返回的值会被候命的步骤获取到;

②对于promise中的异常处理,一般用catch方法而不是用then的第二个参数。在若干个then串联之后,一般会在最后跟一个catch来捕获异常,在执行reject时传递的参数也会在catch中获取到;

③如果then的链式操作前面的步骤返回的是一个promise对象,则该步骤后米昂的then会被当做该promise对象的第一个then方法;

12.promise.all():接收任意个promise对象作为参数,所有的promise对象都完成时才触发then;promise.race():接收任意个promise对象作为参数,任意一个promise完成都能触发then;

13.promise.resolve能够将thenable对象转换为promise对象。所谓的thenable对象就是具有then属性,且属性值是如下格式的函数:

then:(resolve,reject)=>{};

14.promise/A+规范:

①promise可能有三种状态:等待,已完成,已拒绝;

②promise的状态只可能从“等待”转到“完成”或者“拒绝”,不能逆向转换。并且完成和拒绝之间不能相互转换;

③promise必须实现then方法,而且then必须返回一个promise,同一个promise的then可以调用多次(链式)。并且回调的执行顺序

跟他们被定义的顺序一致;

④then方法接收两个参数,前者为从等待到完成的调用,后者为从等待到拒绝的调用;

const readFilePromise=function(fileName){
    return new Promise((resolve,reject)=>{
      fs.readFile(fileName,(err,data)=>{
        resolve(data.toString())
      })
    })
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值