91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中Generator函數有什么用

發布時間:2020-12-02 13:51:19 來源:億速云 閱讀:433 作者:小新 欄目:web開發

這篇文章給大家分享的是有關JavaScript中Generator函數有什么用的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

Generator函數的定義

在阮一峰老師的書中的說法是:  
Generator 函數有多種理解角度。語法上,首先可以把它理解成,Generator 函數是一個狀態機,封裝了多個內部狀態。執行 Generator 函數會返回一個遍歷器對象,也就是說,Generator 函數除了狀態機,還是一個遍歷器對象生成函數。返回的遍歷器對象,可以依次遍歷 Generator 函數內部的每一個狀態。

我的理解:  
生成器函數可以理解為: 函數內部是由多個小函數組成的, 使用yield關鍵字將函數內部 分割成多個塊區域; 并且當函數執行時, 遇到yield就會停止, 并且將yield 后面的表達式結果輸出(當然外部要調用next()方法); 下次再調用next()方法時, 就從上一個停止的地方開始執行(這意味著函數有有記憶功能); 如果下面沒有再遇到yield的話 就像普通函數執行完. 函數的返回值是一個可迭代對象(遍歷器對象); 我喜歡叫可迭代對象, 或者說可遍歷對象...

說一說可迭代對象(iterator)的next()方法

function CreateIterator(iterator) {
    // 定義一個初始下標用來判斷
    let nextIndex = 0;

    // 返回對象: 包含的next方法, 
    return {
        next: function () {
            // 返回一個對象: value是當前對象下標對應的值, done是是否遍歷完成
            return nextIndex < iterator.length ?
                // i++ 先參數運算在 自增1 
                {value: iterator[nextIndex++], done: false} :
                {value: undefined, done: true};
        }
    }
}
// 實例化一個遍歷器
let iter1 = CreateIterator([1,2,3,4,5]);
console.log(iter1); // 一個具有next方法的對象
console.log(iter1.next().value); // 1
console.log(iter1.next().value); // 2
console.log(iter1.next().value); // 3
console.log(iter1.next().value); // 4
console.log(iter1.next().value); // 5
console.log(iter1.next().value); // undefined

生成器函數的使用

generator生成器函數的使用:
function *fn() {
    代碼1; 
    yield; 
    代碼2;
}
普通函數: 執行到底
生成器函數: 遇到yield會暫停,交出執行權,下次執行從上次的停止的位置繼續
生成器函數返回值為: 生成器對象
生成器對象.next()方法才能執行 函數體中的代碼
// 可以解決函數回調嵌套的問題; 解決耗時操作
function *func() {
    // 請求數據.
    // yield ajax() 
    // 處理數據
} 
// generator函數本質上 分割成多個小函數來執行... yield關鍵字前后
// 遇到yield就暫停; 沒有就往下執行...
// yield 起到了 暫停函數執行的作用

關于yield關鍵字的理解

yield傳值

JavaScript中Generator函數有什么用

yield輸出值

JavaScript中Generator函數有什么用

舉個栗子:

     function *g2(x, y) {        
    let sum = x+y;
    yield sum; // sum是第一個輸出結果
        
    let agv = sum / 2;
    yield agv; // agv 是第二個輸出的結果
    
    return {"和": sum, "平均數": agv}; // 最后一個結果
}
    
let gg2 = g2(100, 20);        
console.log(gg2.next().value);  // 120
console.log(gg2.next().value);  // 60
console.log(gg2.next().value);  // { '和': 120, '平均數': 60 }

Generator的應用

這里只做一個簡單舉例, 像我們平時使用的ES7中的 async 函數; 他就是生成器函數的一種應用; 它其實是 Generator 函數的語法糖。

借用ES6入門中的一個例子: 兩種方式去讀取文件

const fs = require('fs');

const readFile = function (fileName) {
  return new Promise(function (resolve, reject) {
    fs.readFile(fileName, function(error, data) {
      if (error) return reject(error);
      resolve(data);
    });
  });
};

// 1.使用生成器函數 讀取文件
const gen = function* () {
  const f1 = yield readFile(__dirname + '/first.json');
  const f2 = yield readFile(__dirname + '/second.json');

  console.log(f1.toString());  // 沒有輸出; 因為 f1 拿到是一個 Iterator 對象 
  console.log(f2.toString());
};

// 使用 async + await 讀取; 注意兩種需配合使用
const asyncReadFile = async function () {
    const f1 = await readFile(__dirname + '/first.json');
    const f2 = await readFile(__dirname + '/second.json');

    console.log(f1.toString());  //async函數的返回值是 Promise 對象
    console.log(f2.toString());
};

gen(); // 沒有值, 需要用 next()方法去取值
asyncReadFile() // 返回值 {"hello": "first"} {"hello": "second"}

所以; 我們這里對比一下; async函數是將 Generator 函數的星號(*)替換成async,將yield替換成await,大大方便了我們的使用。

平時的異步代碼 我們就可以使用 async + await的形式來實現...
比如vue中的一個ajax請求去獲取數據

methods: {
    async getApi() {
        let res = await axios.get('url')
        // 這里的執行順序是同步的...
        console.log(res)
    }
}

感謝各位的閱讀!關于JavaScript中Generator函數有什么用就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

松江区| 郁南县| 博白县| 遂宁市| 康平县| 菏泽市| 广安市| 修文县| 长顺县| 阿拉善右旗| 城口县| 宿迁市| 华阴市| 呼玛县| 张家界市| 左权县| 淮北市| 柯坪县| 瑞安市| 日土县| 定兴县| 长宁区| 石门县| 中宁县| 海淀区| 双鸭山市| 微山县| 三明市| 启东市| 卢湾区| 惠安县| 香港| 松桃| 班玛县| 鹤山市| 吉安县| 连云港市| 灵寿县| 澳门| 上饶市| 定兴县|