ES 6 generator&Promiseで非同期コードを書く
テストファイル
Promiseの使い方と原理
しゅつりょく
generatorの使い方と原理
generatorの実行順序をより明確にするために、コードをテストします.
出力:
テストコード
出力:
[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