用 ES6 generator & Promise 写异步代码

来源:互联网 发布:青少年使用网络调查 编辑:程序博客网 时间:2024/05/16 10:23

测试文件

[root@nginx ~]# cat test_1.txt this is test_1.txt[root@nginx ~]# cat test_2.txtthis 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 end3000 '  on'f1: true1000 '  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 3000wait 1000
0 0