async await 使用笔记

  JavaScript的网络请求异步的,即网络请求不会阻塞当前 js 代码的继续执行,而是经过回调的方式,网络请求的代码块中注入回调函数,当网络请求完成,会触发相应的事件,经过触发事件来执行注册的回调函数。回调的执行时间是不肯定的,所以会影响程序的执行逻辑,另外一方面,若是回调依赖过多,或致使很深的回调嵌套,使代码的可读性和可维护性下降。promise

  async await 是 es7 中的新语法,基于 promise,使异步调用扁平化。网络

  async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法异步执行完成。异步

1 async function asyncFunctionName(){ 2 
3     const response =await fetch(url,options); 4 
5     const result =await response.text(); 6 
7     return JSON.parse( result ); 8 }

  asyncFunction 返回的返回值会经过 Promise.resolve()封装成 Promise 对象,经过 Promise.then()来获取return 的返回值。async

  await 等待的是一个实际返回值,同时await 不单单用于等待 Promise对象,它能够用于等待任何表达式的返回,所以await后面实际是能够接普通函数的调用或者直接量的。若是await 等到的不是一个promise对象,那await 表达式后面的运算结果就是它等到的值;若是await 等到的是一个promise对象,await 就会阻塞当前 js 的继续执行,等着 promise 对象 reslove,获得 resolve 的值,做为await 表达式的运算结果。函数

  由于await 会阻塞代码的运行,因此await 必须放在async 函数体中,而async 函数的调用不会形成阻塞,它内部全部的阻塞都被封装在一个 promise 对象中异步执行。fetch

  async await的优点对比promise在于处理then链。在async函数体中,能够把对异步返回值得处理程序放在 await 后面,程序会依次执行,能够像写同步代码同样写异步回调。url

  注意点:await 等待的promise 对象,运行时可能会reject ,因此最好将await 放在 try{ } catch 代码块中。spa

  

 async ()=>{ try{ const response = await felch(url,options); }catch(err=>{ console.log(err) }) } // 对比 promise 链式调用
 promise.then().catch()