JavaScript 最新特性實(shí)現(xiàn)的三大黑科技
有時(shí)候,我們希望批量執(zhí)行一組異步任務(wù),但是不是 并行 ,而是依次執(zhí)行,這組任務(wù)是動(dòng)態(tài)的,在一個(gè)數(shù)組里,當(dāng)然我們可以用 for 循環(huán)然后一個(gè)一個(gè) await 執(zhí)行,但是還有另外一種方式:
JS Bin on jsbin.com
在上面的例子里,我們定義了一個(gè) taskReducer:
async function taskReducer(promise, action){ let res = await promise; return action(res);}
這個(gè) reducer 的兩個(gè)參數(shù)是 promise 和 action,promise 是代表當(dāng)前任務(wù)的 promise,而 action 是下一個(gè)要執(zhí)行的任務(wù)。我們可以 await 當(dāng)前 promise 執(zhí)行當(dāng)前任務(wù),然后將執(zhí)行結(jié)果傳給下一個(gè) action 就可以了。
這樣我們可以調(diào)用:
[task1, task2, task3, ...].reduce(taskReducer, init);
不管這些任務(wù)是同步還是異步都可以被 依次執(zhí)行 。需要注意的是,每一個(gè)任務(wù)的返回值將是下一個(gè)任務(wù)的輸入 promise 或者 value。
generator 與 async/await 一同使用將上面的代碼進(jìn)一步擴(kuò)展,我們發(fā)現(xiàn),它可以支持 generator 與 async/await 一同使用:
JS Bin on jsbin.com
在上面的例子里,我們定義了一個(gè)計(jì)時(shí) tick 函數(shù),我們通過 timing 來連續(xù)調(diào)用它,而 timing 是一個(gè) generator,計(jì)時(shí)器顯然是異步函數(shù),然而我們可以:
continuous(...timing(10))(0);
而這里的 continuous 其實(shí)就是前面的 reduce 的封裝。
使用 Proxy 實(shí)現(xiàn) PHP 中的常用“魔術(shù)方法”PHP 中有 __get 、 __set 和 __call 三個(gè)強(qiáng)大的魔術(shù)方法,可以實(shí)現(xiàn)對不存在的屬性的讀寫和方法調(diào)用。在新的 ES 標(biāo)準(zhǔn)中添加了 Proxy 類,它可以構(gòu)造 Proxy 對象,用來“重載”對象的屬性和方法讀寫,從而實(shí)現(xiàn)類似于 PHP 的魔術(shù)方法:
JS Bin on jsbin.com
上面的例子里,我們在對象構(gòu)造的時(shí)候,分別“代理”對象實(shí)例的屬性 get 和 set 方法,如果對象上已存在某個(gè)屬性或方法,代理直接返回或操作該屬性。否則,判斷對象上是否有 __get 、 __set 或者 __call 方法,有的話,做相應(yīng)的處理。
這里我們使用裝飾器模式,定義了一個(gè) Magical 裝飾器函數(shù),讓它來處理希望使用 Magical 的類。
等到 ES Decorators 標(biāo)準(zhǔn)化了之后,我們就可以使用更加優(yōu)雅的寫法了:
@magicalclass Foo { __call(key, ...args){... }}
以上就是今天的所有內(nèi)容。ES 的新特性為我們提供了非常強(qiáng)大的功能,讓我們能夠更加優(yōu)雅地寫代碼。有任何問題,歡迎留言討論。
來自:https://www.h5jun.com/post/three-black-tech-in-modern-js.html
相關(guān)文章:
1. ASP中常用的22個(gè)FSO文件操作函數(shù)整理2. 無線標(biāo)記語言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁3. ASP調(diào)用WebService轉(zhuǎn)化成JSON數(shù)據(jù),附j(luò)son.min.asp4. .Net core 的熱插拔機(jī)制的深入探索及卸載問題求救指南5. SharePoint Server 2019新特性介紹6. html清除浮動(dòng)的6種方法示例7. asp的SQL語句中and和or同時(shí)使用的注意事項(xiàng)8. 讀大數(shù)據(jù)量的XML文件的讀取問題9. ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過程解析10. React+umi+typeScript創(chuàng)建項(xiàng)目的過程
