例子1:這個期約在超時以後會解決爲一個值,若是程序中其餘代碼要訪問這個值,則須要一個解決處理函數es6
let p = new Promise((resolve, reject) =>
setTimeout(resolve, 1000, 3)); p.then((x) => console.log(x)); // 3 複製代碼
async function foo() {
console.log(1); return 3; } // 給返回的期約添加一個解決處理程序 foo().then(console.log); console.log(4); console.log(5); // 1 ,4 ,5 , 3 複製代碼
小結:在異步函數若是使用了return返回了值,這個值會被promise.resolve()包裝成一個期約函數,異步函數始終返回期約對象,在函數外部調用能夠獲得他返回的期約promise
// 返回一個沒有實現thenable接口的對象
async function bar() { return ['bar']; } bar().then(console.log); // ['bar'] // 返回一個實現了thenable接口的非期約對象 async function baz() { const thenable = { then(callback) { callback('baz'); } }; return thenable; } baz().then(console.log); // baz // 返回一個期約 async function qux() { return Promise.resolve('qux'); } qux().then(console.log); // qux 複製代碼
小結:異步函數返回值,含thenable則提供then的處理程序解包,不然把返回值當期約處理結果,可是要注意,拒絕期約的錯誤不會被異步函數捕獲瀏覽器
async function foo() {
console.log(1); Promise.reject(3); } // Attach a rejected handler to the returned promise foo().catch(console.log); console.log(2); // 1 // 2 // Uncaught (in promise): 3 複製代碼
//異步寫法
let p = new Promise((resolve, reject) => setTimeout(resolve, 1000, 3)); p.then((x) => console.log(x)); // 3 //async寫法 async function foo() { let p = new Promise((resolve, reject) => setTimeout(resolve, 1000, 3)); console.log(await p); } 複製代碼
小結:await關鍵字會暫停執行異步函數後面的代碼,讓出JS運行時的執行線程,這個行爲和生成器中的yield關鍵字同樣,「await關鍵字一樣是嘗試解包對象的值,而後將這個值傳達給表達式,,再異步恢復異步函數的執行」markdown
爲了更好的理解這個例子,首先要知道這幾個問題閉包
await的地方,等於局部暫停,等待返回值,繼續其餘線程異步
一樣的await按照前後順序從上往下async
當await有多個進程之後,會按照多列順序執行函數
例子1:oop
async function foo() {
console.log(await Promise.resolve('foo')); } async function bar() { console.log(await 'bar'); } async function baz() { console.log('baz'); } foo(); bar(); baz(); // baz // bar // foo 複製代碼
小結:正常狀況是這個順序,「可是你在瀏覽器跑的時候,結果bar和foo的值會調換位子」,ui
首先咱們說一下執行原理:
其次咱們說一下爲何瀏覽器的結果不是這樣:1TC39 對 await 後面是期約的狀況如何處理作過一次修改。修改後,本例中的 foo()裏的await Promise.resolve(’foo‘)只會生成一個異步任務。因此他執行的時候沒有兩列,只有一列,因此會按await順序排列
async function foo() {
console.log(2); console.log(await Promise.resolve(8)); console.log(9); } async function bar() { console.log(4); console.log(await 6); console.log(7); } console.log(1); foo(); console.log(3); bar(); console.log(5); // 1 // 2 // 3 // 4 // 5 //8 // 9 // 6// 7 複製代碼
小結:上面顯示的最新修改事後的結果,按照原結果進程應該是
本文使用 mdnice 排版