JavaScript 最新特性實現的三大黑科技

2021-08-02 18:23:12 字數 1294 閱讀 3478

有時候,我們希望批量執行一組非同步任務,但是不是 並行 ,而是依次執行,這組任務是動態的,在乙個陣列裡,當然我們可以用 for 迴圈然後乙個乙個 await 執行,但是還有另外一種方式:

js bin on jsbin.com

在上面的例子裡,我們定義了乙個 taskreducer:

async function taskreducer(promise, action)

這個 reducer 的兩個引數是 promise 和 action,promise 是代表當前任務的 promise,而 action 是下乙個要執行的任務。我們可以 await 當前 promise 執行當前任務,然後將執行結果傳給下乙個 action 就可以了。

這樣我們可以呼叫:

[task1, task2, task3, ...].reduce(taskreducer, init);

不管這些任務是同步還是非同步都可以被 依次執行 。需要注意的是,每乙個任務的返回值將是下乙個任務的輸入 promise 或者 value。

將上面的**進一步擴充套件,我們發現,它可以支援 generator 與 async/await 一同使用:

js bin on jsbin.com

在上面的例子裡,我們定義了乙個計時 tick 函式,我們通過 timing 來連續呼叫它,而 timing 是乙個 generator,計時器顯然是非同步函式,然而我們可以:

continuous(...timing(10))(0);

而這裡的 continuous 其實就是前面的 reduce 的封裝。

php 中有 __get 、 __set 和 __call 三個強大的魔術方法,可以實現對不存在的屬性的讀寫和方法呼叫。在新的 es 標準中新增了 proxy 類,它可以構造 proxy 物件,用來「過載」物件的屬性和方法讀寫,從而實現類似於 php 的魔術方法:

上面的例子裡,我們在物件構造的時候,分別「**」物件例項的屬性 get 和 set 方法,如果物件上已存在某個屬性或方法,**直接返回或操作該屬性。否則,判斷物件上是否有 __get 、 __set 或者 __call 方法,有的話,做相應的處理。

這裡我們使用裝飾器模式,定義了乙個 magical 裝飾器函式,讓它來處理希望使用 magical 的類。

等到js bin on jsbin.com標準化了之後,我們就可以使用更加優雅的寫法了:

@magical

class foo

}

JavaScript物件屬性的特性

除了包含名字和值之外,屬性還包含的一些標識它們可寫 可列舉和可配置的特性。資料屬性的4個特性分別是它的值 value 可寫性 writable 可列舉性 enumerable 和可配置性 configurable 訪問器屬性的4個特性是讀取 get 寫入 set 可列舉性和可配置性。ecmascri...

AWS 下 Ubuntu 安裝最新XAMPP 實操

一.安裝前檢查更新 sudo apt get updatesudo apt get install axel axel xampp files xampp 20linux 5.6.8 xampp linux x64 5.6.8 0 installer.run 三.安裝xampp 安裝成功!四.啟動 ...

Javascript中的變數的特性

js中的資料型別分為兩類 原始型別和物件型別。原始型別包括數字 字串和布林值。其中有兩個特殊的原始值 null和undefined。它們分別代表了各自特殊 型別的唯一的成員。另外復合型別是指物件,它是屬性的集合。包括普通物件 陣列 函式 regexp以及error。一 原始型別 1 數字 在js中不...