前言
es6 中提出乙個叫生成器(generator)的概念,執行生成器函式,會返回迭代器物件(iterator),這個迭代器物件可以遍歷函式內部的每乙個狀態。
function* helloworldgenerator()
// 通過執行生成器返回迭代器物件
var helloworlditerator = helloworldgenerator();
helloworlditerator.next();
// helloworlditerator.next();
// helloworlditerator.next();
// helloworlditerator.next();
// 複製**
迭代器物件通過呼叫 next() 方法,遍歷下乙個內部狀態,生成乙個值,這也是 generator 名字的由來。
一、generator 的非同步呼叫
每當 generator 生成乙個值,程式會掛起,自動停止執行,隨後等待下一次執行,直到下一次呼叫 next() 方法,但並不影響外部主線程其他函式的執行。
generator 讓函式執行過程有了同步的特點,基於這個特點,我們將非同步呼叫和生成器結合起來:
先後列印 "hello china!", "hello wolrd!", "hello earth!";
function
fetch(word) , 2000)
})}function* gen() catch(error)
}const iterator = gen(); // 返回迭代器物件
const result1 = iterator.next().value;
result1
.then(res1 => )
.then(res2 => )
.then(res3 => )
複製**
每次呼叫迭代器的 next 方法,會返回乙個 promise 物件,通過 promise 物件狀態從 pending 轉移到 fullfilled 狀態,可以在 .then() 方法後執行下乙個非同步方法。
二、generator 自執行
從第二節中可以看出,generator 每次呼叫非同步方法,都要手動執行一次 iterator.next(),通過遞迴 iterator.next() 我們就不用再手動執行 next() 方法了。
function
fetch(word) , 2000)
})}function* gen() catch(error)
}function
co(gen) )
}next();
}co(gen);
複製**
三、在迭代器中丟擲錯誤
迭代器除了能在 next() 方法中傳遞引數外,還能通過 iterator.throw 方法捕捉到錯誤,從而增強了非同步程式設計的錯誤處理能力。
function
fetch(word) , 2000)
})}function* gen() catch(error)
}const iterator = gen(); // 返回迭代器物件
const result1 = iterator.next().value;
result1
.then(res1 => )
.then(res2 => )
.then(res3 => )
複製**
呼叫了 iterator.throw 方法後,錯誤就能被丟擲被生成器中的中的 try catch 捕捉到,且阻止後面的**繼續執行。
四、generator 應用場景
generator 最令人興奮的地方在於,生成器中的非同步方法看起來更像是同步執行。不好的地方在於執行過程比較生硬。
總結generator 生成具有 symbol.iterator 屬性的迭代器物件,迭代器具有 next 方法,能夠無阻塞地將**掛起,下次呼叫 .next() 方法再恢復執行。
用 generator 實現非同步程式設計只是乙個 hack 用法,generator 的語法糖 async & await 則能將非同步程式設計寫得更簡潔優雅。
非同步程式設計之async,await
c 5引入非同步程式設計,可以在.net framework 4.5及更高版本或者.net core中進行非同步程式設計。關於非同步程式設計的主要使用場景,參見使用 async 和 await 的非同步程式設計 c static void main string args 模擬非同步main sta...
C 非同步程式設計之async await
async和await這一組關鍵字是.net4.5新增的一種非同步程式設計方式,今天就根據自己的理解講講async和await與task之間的關係。拿作業系統來說,cpu就具有非同步性。當在進行io的耗時操作時,cpu不會處於阻塞狀態,而是可以繼續執行其它的指令。程式設計中非同步通常用於開啟大檔案 ...
JS的非同步程式設計
generator非同步方案 async await語法糖 let url1 url1 url2 url2 ajax function getdata url,data error function err let url1 url1 url2 url2 getdata url1 then res ...