第一:引入阮一峰2012年资源 javascript异步编程的处理方法
资源:
http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
(1)理解了Javascript语言的执行环境是"单线程"
(2)理解了同步代码&&异步代码区别==>同步代码:程序的执行顺序与任务的排列顺序是一致的==>异步代码:每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,程序的执行顺序和任务的排列顺序是不一致的,异步的
(3)理解了回调函数==>把一个函数当成参数传递,将来特定的时机调用,这个函数就叫回调函数
回调函数的问题==>1..回调函数的阅读性不好,回调不会立马执行 2..回调函数的可维护性差,回调函数如果有大量的嵌套,会形成回调地狱
const.log(1) setTimeout(function(){ console.log(2) setTimeout(function(){ console.log(4) },10000) console.log(5) },10000) //setTimeout语法 //setTimeout(参数1,参数2) //setTimeout(fn,时间) console.log(3)
打印结果顺序是?
如:ajax请求操作,在浏览器端,为了避免在请求耗时过长,浏览器失去响应,所以会使用异步代码来处理 ====补充:因为javascript语言执行环境是单线程的,假设如果允许同步执行所有的http请求,服务器性能会急剧下降,出现假响应的情况,很快就会失去响应,这就引出了promise对象解决异步编程的方案
============================================================================
第二:引入ES6 的 Promise 对象
资源:
https://www.bilibili.com/video/BV1Sf4y1171C/?spm_id_from=333.788.recommend_more_video.1
https://www.bilibili.com/video/BV1vV411k7hM?t=314
(1)所谓promise简单来说就是一个容器,它里面放着将要被执行的操作,在当下代码并没有完成,但这是一个承诺,这个承诺一定会被兑现,那么兑现成功之后就可以来呼叫一下promise.then,失败则是promise.catch
辅助理解代码如下:
console.log('before') const promise = axios.get('url') promise.then(function(res){}).catch(function(err){})
promise底层原理辅助理解代码如下所示:
es6的原生提供了promise对象,promise对象是一个构造函数,用来生成Promise实例,promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject,resolve和reject这两个函数是promise对象内部提供的,resolve&&reject对应promise.then和promise.catch
const promise = new Promise(function(resolve,reject){ console.log('Run!') setTimeout(function(){ resolve()//成功时被呼叫 reject()//失败时被呼叫 },3000) }) promise.then(function(res){ console.log('promise.then被打印了') }).catch(function(err){ cosole.log('promise.catch被打印了') })
补充:
promise的三个状态:
1.pending状态 promise对象已创建出来,默认就是pending状态
2.resolved/fulfilled(成功)
3.rejected(失败)
1.resolve函数作用:成功的时候调用,将promise的状态从pending状态改成fulfilled,将来需要调用的时候,使用.then函数
2.reject函数作用,失败的时候调用,将promise的状态从pending改成rejected,将来需要调用的时候使用.catch的方法
3.promise的状态只能修改一次,且一旦修改了,就会状态凝固
意味着:如果连续调用多次resolve 或 rejecte是没有任何意义的
===============================================================================
第三 由于使用promise的时候虽然有return的语法再.then这种链式结构解决了回调的问题 但是里面还是掺杂着大量的回调,所以这种时候就有了async 和 await这一对关键字,配合使用的出现
async和await这一对关键字仅仅是优化了promise的使用时的可读性,不是替代promise的,async和await提高了代码的可阅读性
代码执行顺序是//2 1
async function fn(){ const res = await 1 console.log(res) } fn() console.log(2)
以下是辅助理解:
1.async用于修饰一个函数,表示一个函数是异步的
如果async函数内没有await 那么async是没有意义的 全是同步的内容
只有遇到了await开始 才是异步的开始
2.await只能用在async函数中
3.await后面一般跟的是一个promise对象,await会阻塞async函数的执行 直到等到promise成功的结果(resolved的结果)
4.await只会等待promise成功的结果 ,如果失败了会报错,需要try catch
=========================================================================
针对于Promise专栏一,在promise专栏二中有三个重点需要掌握
第一个是 原生ajax请求的过程
第二个是 promise封装ajax请求发送的过程
第三个是 async和await对于使用promise对象封装ajax请求的优化过程