异步编程

Javascript任务执行模式,分同步执行(synchronous)和异步执行(asyncchronous)。
异步编程方案的根本是回调函数(调用者定义,交给执行者执行的函数就是回调函数)
Js线程在某一刻发起了一个异步调用,代码继续向后执行其他任务,异步线程会单独执行异步任务,任务执行之后会将任务的回调放到消息队列。Js主线程在完成所有任务过后,会依次执行消息队列中的任务。
Promise基本用法
用promise封装一个ajax方法

function ajax (url){ return new Promise((resolve,reject)=>{ let xhr = new XMLHttpRequest(); xhr.open('GET',url); // 设置请求类型 xhr.responseType = 'json'; //请求完成后拿到一个json对象 xhr.onload = function() { if(this.status === 200){ resolve(this.response) }else{ reject(new Error(this.statusText)) } } xhr.send() }) }

测试代码
ajax('本地文件').then((res)=>{ console.log(res); },(err)=>{ console.log(err) })

promise调用,避免进入回调地狱,借助于then方法,尽可能保证任务扁平化.
then方法返回一个全新的promise对象,每一个then方法都是为上一个then方法返回的promise对象去添加状态明确过后的回调。then方法会依次执行,如果then方法返回的是一个普通值,将作为当前then方法返回的promise的值,下一个then方法参数就是,如果什么都不返回,就是undefinde
总结来说
promise对象的then方法返回一个全新的promise对象
后面的then方法就是在为上一个then返回的promise注册回调
前面then方法中回调函数的返回值会作为后面then方法回到的参数
如果回调中返回的是promise,那后面then方法的回调会等待他的结束
reject中会捕获promise执行中出现的失败或者异常,但是推荐使用catch捕获,不要漏过任何一个异常
promise的静态方法
promise.resolve()
如果传入的是一个 Promise 对象,Promise.resolve 方法原样返回,如果传入的是一个值,值做返回值返回。
如果传入的是带有一个跟 Promise 一样的 then 方法的对象,相当于实现了一个thenable的接口
Promise.resolve 会将这个对象作为 Promise 执行
Promise.resolve({ then: function (onFulfilled, onRejected) { onFulfilled('foo') } }) .then(function (value) { console.log(value) })

Promise.reject无论传入什么参数,都会作为这个 Promise 失败的理由
【异步编程】 异步执行时序
这个问题涉及到js事件循环,首先js事件分两种,宏任务和微任务
宏任务包括setTimeout,script,setInterval,
微任务包括promise中的then方法,node.js中的process.nextTick
分开了解他们的特点:
setTimeOut并不是直接的把你的回调函数放进上述的异步队列中去,而是在定时器的时间到了之后,把回掉函数放到执行异步队列中去,它属于异步代码。队列有先进先出的特点,先排队的先执行,setTimeout执行需要满足两个条件
  1. 主进程必须是空闲的状态,如果到时间了,主进程不空闲也不会执行你的回掉函数
  2. 这个回掉函数需要等到插入异步队列时前面的异步函数都执行完了,才会执行
    执行顺序就是宏任务->微任务队列->宏任务队列
关于promise,async/await
1,pomise是同步任务,他的回调是异步任务
2,async关键字函数会返回一个promise对象,如果函数里面没有await关键字,那就相当于一个普通函数,await关键字后面的代码就属于异步任务。

    推荐阅读