Generatorジェネレータ
5538 ワード
さぎょう
単純な使用
function* showWords() {
yield 'one';
yield 'two';
return 'three';
}
var show = showWords();
show.next() // {done: false, value: "one"}
show.next() // {done: false, value: "two"}
show.next() // {done: true, value: "three"}
show.next() // {done: true, value: undefined}
非同期処理、キュー生成、ajax多層ネストなどに適した処理
function fn1(){
setTimeout(function(){
console.log('fn1')
g.next();
},1000)
}
function fn2(){
setTimeout(function(){
console.log('fn2')
g.next();
},1000)
}
function fn3(){
setTimeout(function(){
console.log('fn3')
g.next();
},1000)
}
function* gen(){
yield fn1();
yield fn2();
yield fn3();
return;
}
var g=gen();
g.next();
nextロジック
next()呼び出しのパラメータ
function* showNumbers() {
var one = yield 1;
var two = yield 2 * one;
yield 3 * two;
}
var show = showNumbers();
show.next().value // 1
show.next().value // NaN -->2 * undefined
show.next(2).value // 6
ジェネレータネスト
function* showWords() {
yield 'one';
yield* showNumbers();
return 'three';
}
function* showNumbers() {
yield 10 + 1;
yield 12;
}
var show = showWords();
show.next() // {done: false, value: "one"}
show.next() // {done: false, value: 11}
show.next() // {done: false, value: 12}
show.next() // {done: true, value: "three"}
for...of代替next();
function* showNumbers() {
yield 1;
yield 2;
return 3;
}
var show = showNumbers();
for (var n of show) {
console.log(n) // 1 2
}
ジェネレータとpromise
function request(url) {
return new Promise(function(resolve, reject) {
//ajax resolve
ajax(url, resolve);
});
}
request('url').then(function(res) {
console.log(res);
})
function foo(x) {
return request('url' + x);
}
// promise
function* fn() {
var text = yield foo(1);
}
var it = fn();
// promise
var p = it.next().value;
// promise
p.then(function(text) {
//
it.next(text);
}
ジェネレータとコモンシップ
Thunk関数
* " " , , 。 Thunk 。
// readFile( )
fs.readFile(fileName, callback);
// Thunk readFile( )
var readFileThunk = Thunk(fileName);
readFileThunk(callback);
var Thunk = function (fileName){
return function (callback){
return fs.readFile(fileName, callback);
};
};
function co(generator) {
return function(fn) {
var gen = generator();
function next(err, result) {
if(err){
return fn(err);
}
var step = gen.next(result);
if (!step.done) {// , value (thunk ), next
step.value(next);
} else {
fn(' ', step.value);
}
}
next();
}
}
次の操作を行います.
function readFile(filename) {// ,yield thunk
return function(callback) {
require('fs').readFile(filename, 'utf8', callback);
};
}
co(function* () {
var file1 = yield readFile('./file/a.txt');
var file2 = yield readFile('./file/b.txt');
console.log(file1);// 1
console.log(file2);// 2
return 'done';
})(function(err, result) {
console.log(err,result)
});
MDNの比較的に良いウェブサイト
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*