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())
})
})
}