async和await詳解

async 和 await語法糖詳解

async用於聲明一個function是異步的,無論function是普通函數仍是異步函數,經過async修飾以後,返回的都是一個promise對象;而 await 用於等待一個異步方法執行完成。
await只能出如今async函數中或者 let value = await promise這種在環境的頂層做用域中使用,好比在window做用頂層函數中可使用;可是await能夠用來修飾任何函數,經過await修飾的任何函數,表示等待該行數執行以後再日後執行,代表是一個同步的過程。

async用法:

async函數(包含函數語句、函數表達式、Lambda表達式)會返回一個Promise對象,若是在asyn聲明的一個函數中直接return 一個直接量,async 會把這個直接量經過Promise.resolve()封裝成 Promise 對象。


//async 用來修飾一個返回Promise對象的函數
async function myPromise(){
  return new Promise((res,rej)=>{
    //console.log(1);
    res()
  })
}
//async 用來修飾一個普通函數
async function normalFunc(){
  return "normal function"
}
var pro=myPromise();
var nor=normalFunc()複製代碼

await用法:以下圖,若是await調用不是在異步函數做用就會出錯


一、await用在async函數中

二、await用在頂層函數中


function getSomething() {
    return "something";
}
function testPromise() {
    return Promise.resolve("hello Promise");
}
async function testAsync() {
    return "hello async";
}
async function testNormal() {
    const v1 = await getSomething();  //await用來修飾一個普通函數
    const v2 = await testPromise();  //await用來修飾一個返回promise對象的函數
    const v3 = await testAsync(); //await用來修飾一個經過async構成的異步函數
    //上面的await這種寫法等價於下面這種promise的寫法
   console.log(getSomething()) 
    let vv=testPromise().then(res=>{
            console.log(res)
            testAsync().then(res=>{
              console.log(res)
            })
         })
    console.log(v1,v2,v3);
}
testNormal()複製代碼
async和await的優勢用於處理Promise的.then處理,以前咱們想在異步函數中達到同步的想過,因此異步執行以後的要執行的代碼都會放在Promise的then方法中執行,達到同步的效果,可是async和await的出現,讓js中的異步函數能夠按順序寫代碼的方式,達到代碼順序執行的效果。

若有什麼描述不合理之處,歡迎指出promise

相關文章
相關標籤/搜索