天天看點

Future和async(異步函數)、await(同步等待)

一、Future異步任務

then 與 Future 函數體共用一個事件循環。而如果 Future 有多個 then,它們也會按照鍊式調用的先後順序同步執行,同樣也會共用一個事件循環。

then 會在 Future 函數體執行完畢後立刻執行,無論是共用同一個事件循環還是進入下一個微任務。

Future和async(異步函數)、await(同步等待)
Future和async(異步函數)、await(同步等待)

對于一個Future對象,執行完成後,後面的then調用會共用Future 函數體的事件循環。會在函數體執行完後,順序執行。如上圖中的黃框所示。

如果then函數體是一個 Future 異步任務,這個 then,以及後續的 then 都被放入到事件隊列中,後面的then會等待Future執行完成後再執行。如上圖中的紅框所示。

二、Then中的Future異步任務

then中的異步任務不會阻塞後續的then,這和上面的then的函數體如果是一個Future,會阻塞後續的then的執行有很大的差別。

Future和async(異步函數)、await(同步等待)
Future和async(異步函數)、await(同步等待)

三、async(異步函數)和 await(同步等待)

async關鍵字用于指定函數是一個異步函數。通常情況下,當我們調用一個函數時,隻有等待這個函數的代碼執行完成後,才會執行函數後面的代碼。但現在如果我給這個函數加入一個async關鍵字後,調用這個函數,不用等待這個函數的代碼全部執行完,函數後面的代碼就會立即執行。

await隻能用在async函數中。

如下圖所有,delayS是一個異步函數,在main函數中調用delayS(3),不會阻塞後面的代碼執行。

Future和async(異步函數)、await(同步等待)
Future和async(異步函數)、await(同步等待)

上面的main中的代碼如果想同步順序的執行,必須在main函數添加async關鍵字,同時調用delayS函數時,使用await delayS(3);

Future和async(異步函數)、await(同步等待)
Future和async(異步函數)、await(同步等待)