es6之Generator

来源:http://www.cnblogs.com/colima/archive/2017/05/26/6904782.html
-Advertisement-
Play Games

1.Generator函數其實是一個封裝了多個內部狀態的狀態機,執行它會返回一個遍歷器對象,然後可以依次遍歷Generator中的每一個狀態,也就是分段執行,yield是暫停執行的標記,next恢復執行。 2.yield: - 一個函數裡面,return只能執行一遍,yield可以執行多次; - G ...


1.Generator函數其實是一個封裝了多個內部狀態的狀態機,執行它會返回一個遍歷器對象,然後可以依次遍歷Generator中的每一個狀態,也就是分段執行,yield是暫停執行的標記,next恢復執行。

2.yield:

  - 一個函數裡面,return只能執行一遍,yield可以執行多次;

  - Generator函數可以不用yield,這時就是一個簡單的暫緩執行函數;

  - yield只能用在Generator函數里;

  - yield如果用在一個表達式里,必須放在圓括弧里

function* foo() {
    console.log('hello' + (yield));
    console.log('hello' + (yield 'world'));
}

  - yield用於函數參數或放在賦值表達式的右邊,可以不加括弧

function* demo() {
    foo(yield 'a', yield 'b');
    let input = yield;
}

 3.可以把Generator函數賦值給對象的Symbol.iterator屬性,從而使對象具有Iterator介面

var obj = {};
obj[Symbol.iterator] = function* (){
    yield 1;
    yield 2;
};

[...obj] // [1,2]

4.next方法的參數會被當做上一個yield的返回值,這樣就可以在函數運行期間向內部傳值。

5.for...of會自動遍歷Generator函數生成的Iterator對象,不需要調用next方法。

// 實現Fibonacci數列
function* fib() {
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

for (let n of fib()) {
    if (n > 1000) break;
    console.log(n);
}

6.遍歷器對象的throw方法。

7.遍歷器對象的return方法可以返回給定的值且終結遍歷。

8.yield* 表達式用來在一個Generator函數里調用另一個Generator函數,而後面這個函數其實就是for...of的一種簡寫;

  - yield* 後面如果跟著數組,則會遍歷該數組;

  - yield* 後面如果跟著字元串,也會遍歷字元串;

  - 如果後面的Generator函數有return語句,那麼就可以像這個函數返回數據

function *foo() {
    yield 2;
    return "foo";
}

function *bar() {
    yield 1;
    var v = yield *foo();
    console.log( "v: " + v );
    yield 3;
}

var it = bar();

it.next() // {value: 1, done: false}
it.next() // {value: 2, done: false}
it.next() // "v: foo"
          // {value: 3, done: false}
it.next() // {value: undefined, done: true}

9.作為屬性的Generator: let obj = { * foo(){}};

10.Generator函數返回的遍歷器對象是函數的實例,也繼承了函數的prototype上的方法;

// 使用this
function* F() {
    this.a = 1;
    yield this.b = 2;
}
var f = F.call(F.prototype);

f.next();  // Object {value: 2, done: false}
f.next();  // Object {value: undefined, done: true}

f.a // 1
f.b // 2

11.Generator函數的應用:

  - 非同步操作可以用同步寫法;

  - 控制流管理;

  - 部署Iterator介面;

12.協程:多個線程互相協作,完成非同步任務;Generator函數就是協程在es6的實現,其特點是交出函數的執行權。

13.Thunk函數其實就是傳名調用,將參數放到一個臨時函數中,用來替換某個表達式傳入函數體。

function f(m) {
  return m * 2;
}

f(x + 5);

// 等同於

var thunk = function () {
  return x + 5;
};

function f(thunk) {
  return thunk() * 2;
}

在js中,js是傳值調用,Thunk 函數替換的不是表達式,而是多參數函數,將其替換成一個只接受回調函數作為參數的單參數函數。Thunk 函數是自動執行 Generator 函數的一種方法。

// 正常版本的readFile(多參數版本)
fs.readFile(file, callback);

// Thunk版本的readFile(單參數版本)
var Thunk = function (file) {
  return function (callback) {
    return fs.readFile(file, callback);
  };
};

var readFileThunk = Thunk(file);
readFileThunk(callback);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • hljs.initHighlightingOnLoad(); SetConsoleScreenBufferSize函數 來源:https://msdn.microsoft.com/en us/library/windows/desktop/ms686044(v=vs.85).aspx 作用 指定控制 ...
  • 一些事情久久不能釋懷,於是最近學習了下最短路的演算法,希望我能變得輕鬆些。 dijkstra是一種單源最短路演算法。在沒有負權值的圖上,vi..vj..vk是vi到vk最短路的話,一定要走vi到vj的最短路。所以每次取出到起點距離最小的點,從該點出發更新鄰接的點的距離,如果更新成功則把新點加入prior ...
  • 也許很多朋友在學習NIO的時候都會感覺有點吃力,對裡面的很多概念都感覺不是那麼明朗。在進入Java NIO編程之前,我們今天先來討論一些比較基礎的知識:I/O模型。下麵本文先從同步和非同步的概念 說起,然後接著闡述了阻塞和非阻塞的區別,接著介紹了阻塞IO和非阻塞IO的區別,然後介紹了同步IO和非同步IO... ...
  • 在實際的應用場景中,兩個實體之間不只是簡單的一對一關係,還會出現多對多關係,同時還有可能會出現多對多關係還附帶有其他欄位的情況。本文通過幾個例子,對錶間多對多關係的實體類代碼表示方法進行描述。這種設計方法,並不只是在使用 ORM 框架時需要,事實上,它是 POCO 及簡單 Java 類(POJO)的... ...
  • 圓角邊框以及陰影製作卡片式圖片 圓角邊框 border-radius 卡片使用陰影 box-shadow 利用陰影給圖片底部創造一個長方形 內部的元素會直接覆蓋整個陰影 HTML 部分 CSS 部分 圖片展示 此文到此結束 此文參考鏈接 http://www.w3school.com.cn/cssr ...
  • Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 re ...
  • 前文提要:【js實例】js中的5種基本數據類型和9種操作符 Array類型的9個數組方法 Array中有9個數組方法: 1.檢測數組 2.轉換方法 3.棧方法 4.隊列方法 5.沖排序方法6.操作方法 7.位置方法 8.迭代方法 9.歸併方法 在實例中介紹,實例如下 Date類型的41個日期方法 D ...
  • 做為css佈局的又一種新方式,Flex擁有極強的使用效果,相比原來的float,position對元素樣式的操作更加簡潔,本文是我的一點學習經驗和心得吧,如有錯誤以及不足之處,請多多指點。 好進入正題吧,首先借用阮一峰大神的一副圖片: 再來說說flex的幾個屬性吧: 一、容器屬性 1.flex-di ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...