1. 程式人生 > >async + await 和直接同步方式執行的區別

async + await 和直接同步方式執行的區別

一、問題

在寫koa2專案的時候,用async + await等待非同步執行用的比較多,就有一個疑問,async + await和nodejs中的的同步方法到底有什麼區別,如果僅僅是把非同步變同步方法,為什麼不直接用同步方法呢?

二、區別

在網上看了一些別人的回答,總結一下:

1.await會在async非同步函式內阻塞當前執行緒向後執行,但是同樣可以並行執行多個非同步操作,例如:

let a = await promiseFun() await 阻塞後面的語句執行

//假設promiseFun是一個非同步方法
function promiseFun(){
    return new Promise
((resolve,reject)=>{ new Promise((resolve,reject)=>{ resolve() }) .then(()=>{ resolve("promiseFun") console.log('innerPromise') }) }) } async function fn(){ let a = await promiseFun(); console.log('fn') }

輸出:
在這裡插入圖片描述
但是await用在不同的地方,效率是不同的,這樣用就可並行執行非同步操作:

    //假如promiseFun()執行要1s,那麼下面執行要2s,因為await會阻塞後面的語句執行
let a = await promiseFun()
let b = await promiseFun()
    //但是這樣寫,執行時間會小於2s,非同步併發執行
let a = promiseFun()
let b =  promiseFun()
await a;
await b;

await並不是阻塞主執行緒執行,因為async函式本身是非同步的,所以await其實是阻塞的當前非同步函式的非同步執行緒

看示例:

var hold = function () { 
    return
new Promise(function (resolve, reject) { resolve(); }) }; async function count(i){ await hold() console.log(i) } for(var i = 0 ;i < 10 ; i++) count(i); console.log("run")

輸出結果:
在這裡插入圖片描述
可以看到,先輸出的是“run”,而不是0123456789,所以被async標記的函式是非同步執行的,只不過我們寫起來像是同步函式一樣,忘記它本來就是非同步函式。

三、總結

  1. 雖然await會阻塞async非同步函式,但是並沒有阻塞主執行緒。
  2. 雖然await阻塞非同步函式向後執行,看起來像是同步的,但是它本質還是非同步的,我們同樣可以並行執行。而同步函式不能並行執行。