es6新特性之generator

以下內容來自https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000
1、generator由 function*定義,且除了return語句還可以用yield返回

function* test(x){
    yield x+1;
    yield x+2;
    return x+3;
}

2、調用
test(1)只是創建了一個generator對象,
a、調用方式一:
var f = test(1);
f.next();

next()方法會執行generator的代碼,然後,每次遇到yield 就返回一個對象{value: x, done: true/false},然後“暫停”。返回的value就是yield的返回值,done表示這個generator是否已經執行結束了。如果done爲true,則value就是return的返回值。
當執行到done爲true時,這個generator對象就已經全部執行完畢,不要再繼續調用next()了
b、用for .. of循環迭代

'use strict'

function* fib(max) {
    var
        t,
        a = 0,
        b = 1,
        n = 0;
    while (n < max) {
        yield a;
        [a, b] = [b, a + b];
        n ++;
    }
    return;
}
for (var x of fib(10)) {
    console.log(x); // 依次輸出0, 1, 1, 2, 3, ...
}

3、ajax中的使用
嵌套使用ajax時非常麻煩如:

ajax('http://url-1', data1, function (err, result) {
    if (err) {
        return handle(err);
    }
    ajax('http://url-2', data2, function (err, result) {
        if (err) {
            return handle(err);
        }
        ajax('http://url-3', data3, function (err, result) {
            if (err) {
                return handle(err);
            }
            return success(result);
        });
    });
});

如果使用generator,代碼如下:

try {
    r1 = yield ajax('http://url-1', data1);
    r2 = yield ajax('http://url-2', data2);
    r3 = yield ajax('http://url-3', data3);
    success(r3);
}
catch (err) {
    handle(err);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章