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);
})
複製代碼