ES6 Generator函數

1.什麼是Generator編程

Generator函數是一種異步編程解決方案。json

執行Genenrator函數會返回一個遍歷器對象,依次遍歷Generator函數內部的每個狀態。 Generator函數是一個普通函數,有如下兩個特徵: function關鍵字與函數名之間有個星號; 函數體內使用yield表達式,定義不一樣狀態; 經過調用next方法,將指針移向下一個狀態,直到遇到下一個yield表達式(或return語句)爲止。簡單理解,Generator函數分段執行,yield表達式是暫停執行的標記,而next恢復執行。bash

var GN = function* (){
    yield 1;
    yield 2;
    yield 3;
}
GN.next() // {value : 1, done : false}
複製代碼

2.和Iterator 接口的關係異步

任意一個對象的Symbol.iterator方法,是一個遍歷器生成函數,調用該函數會返回該對象的一個遍歷器對象。 Generator 函數就是遍歷器生成函數,所以能夠把 Generator 賦值給對象的Symbol.iterator屬性,從而使得該對象具備 Iterator 接口。異步編程

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

[...obj] // [1, 2, 3]
複製代碼

3.使用場景函數

// 控制流管理
// 使用前
f1(function(v1){
    f2(function(v2){
        f3(function(v3){
            // ... more and more
        })
    })
})

// 使用Promise 
Promise.resolve(f1)
    .then(f2)
    .then(f3)
    .then(function(v4){
        // ...
    },function (err){
        // ...
    }).done();
    
// 使用Generator
function * f (v1){
    try{
        let v2 = yield f1(v1);
        let v3 = yield f1(v2);
        let v4 = yield f1(v3);
        // ...
    }catch(err){
        // console.log(err)
    }
}

//異步編程的使用
function * f(){
    let submitOrderCallServer = yield CommonCallServer.submitOrder(params);
    console.log(submitOrderCallServer);
}
// 執行該函數
let g = f();
let result = g.next();
// 因爲咱們項目裏CommonCallServer返回的是Promise對象,因此用then
result.value.then(function(data){
    return data.json();
}).then(function(data){
    g.next(data);
})

複製代碼
相關文章
相關標籤/搜索