第一:引入阮一峰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请求的优化过程