js async await

既然有了promise 爲何還要有async await ? 固然是promise 也不是完美的異步解決方案,而 async await 的寫法看起來更加簡單且容易理解。promise

async function test() {
    return "SpongeBob";
}

const result = test();
console.log(result);// 獲得Promise { 'SpongeBob' } // 居然返回一個Promise 對象

因此,async 函數返回的是一個 Promise 對象。async 函數會返回一個 Promise 對象,若是在函數中 return 一個直接量,async 會把這個直接量經過 Promise.resolve() 封裝成 Promise 對象。異步

async 函數返回的是一個 Promise 對象,因此在最外層不能用 await 獲取其返回值的狀況下,可用.then() 鏈來處理這個 Promise 對象async

test().then(v => {
    console.log(v);    // 輸出 SpongeBob
});

 

await 在等啥函數

async 函數返回一個 Promise 對象,因此 await 能夠用於等待一個 async 函數的返回值——這也能夠說是 await 在等 async 函數,但要清楚,它等的實際是一個返回值。注意到 await 不單單用於等 Promise 對象,它能夠等任意表達式的結果,因此,await 後面實際是能夠接普通函數調用或者直接量的。spa

function get() {
    return "my";
}

async function test() {
    return Promise.resolve("SpongeBob"); 
}
async
function test() {
   const v1
= await get();
  const v2
= await test();
  console.log(v1, v2);
}
test();

若是它等到的是一個 Promise 對象,await 就忙起來了,它會阻塞後面的代碼,等着 Promise 對象 resolve,而後獲得 resolve 的值,做爲 await 表達式的運算結果。await 表達式會暫停當前 async function 的執行,等待 Promise 處理完成。若 Promise 正常處理(fulfilled),其回調的resolve函數參數做爲 await 表達式的值,繼續執行async function。若 Promise 處理異常(rejected),await 表達式會把 Promise 的異常緣由拋出。另外,若是 await 操做符後的表達式的值不是一個 Promise,則返回該值自己。code

  1. async 告訴程序這是一個異步,awiat 會暫停執行async中的代碼,等待await 表達式後面的結果,跳過async 函數,繼續執行後面代碼
  2. async 函數會返回一個Promise 對象,那麼當 async 函數返回一個值時,Promise 的 resolve 方法會負責傳遞這個值;當 async 函數拋出異常時,Promise 的 reject 方法也會傳遞這個異常值
  3. await  操做符用於等待一個Promise 對象,而且返回 Promise 對象的處理結果(成功把resolve 函數參數做爲await 表達式的值),若是等待的不是 Promise 對象,則用 Promise.resolve(xx) 轉化
相關文章
相關標籤/搜索