JS非同步程式設計之Generator

2021-09-11 20:50:42 字數 2113 閱讀 1488

前言

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 ...