ES 6 generator&Promiseで非同期コードを書く

6449 ワード

テストファイル
[root@nginx ~]# cat test_1.txt 
this is test_1.txt
[root@nginx ~]# cat test_2.txt
this is test_2.txt

Promise非同期制御


Promiseの使い方と原理
var fs = require('fs');

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

            resolve(data.toString());
        }); 
    }); 
};  

readFile('test_1.txt').then(function(data) {
    console.log(data);
}); 

しゅつりょく
[root@nginx ~]# node --harmony g.js 
this is test_1.txt

generator非同期制御


generatorの使い方と原理
generatorの実行順序をより明確にするために、コードをテストします.
var func = function(time) {
    setTimeout(function() {
        console.log(time, "  on");
        result.next(true);
    }, time);
};

var gen = function * () {
    var f1 = yield func(3000);
    console.log('f1:', f1);
    var f2 = yield func(1000);
    console.log('f2:', f2);
};

var result = gen();

result.next();
console.log('end');

出力:
[root@nginx ~]# node --harmony g.js 
end
3000 '  on'
f1: true
1000 '  on'
f2: true

Promiseとgeneratorを組み合わせて非同期制御を行う


テストコード
var fs = require('fs');

var wait = function(time) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            console.log('wait', time);
            resolve(true);
        }, time);   
    });
};

var func = function* (time) {
    try {
        var res_1 = yield wait(3000);
        var res_2 = yield wait(1000);
    } catch (e) {
        console.log(e);
    }
};

var run = function(g) {
    var it = g();

    function go(result) {
        if (result.done) {
            return result.value;
        }

        return result.value.then(function(value) {
            return go(it.next(value));
        }, function(err) {
            return go(it.throw(value));
        });
    }

    go(it.next());
};

run(func);

出力:
[root@nginx ~]# node --harmony g.js 
wait 3000
wait 1000