async + await 和直接同步方式執行的區別
阿新 • • 發佈:2019-01-06
一、問題
在寫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標記的函式是非同步執行的,只不過我們寫起來像是同步函式一樣,忘記它本來就是非同步函式。
三、總結
- 雖然await會阻塞async非同步函式,但是並沒有阻塞主執行緒。
- 雖然await阻塞非同步函式向後執行,看起來像是同步的,但是它本質還是非同步的,我們同樣可以並行執行。而同步函式不能並行執行。