關鍵詞:狀態機,遍歷器,同步方式寫異步方法git
function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); var h = helloWorldGenerator();
// 接上面的demo hw.next() // { value: 'hello', done: false } hw.next() // { value: 'world', done: false } hw.next() // { value: 'ending', done: true } hw.next() // { value: undefined, done: true }
(function (){ yield 1; })()
console.log('Hello' + yield); // SyntaxError console.log('Hello' + yield 123); // SyntaxError console.log('Hello' + (yield)); // OK console.log('Hello' + (yield 123)); // OK
foo(yield 'a', yield 'b'); // OK let input = yield; // OK
function* gen(){ yield 1; yield 2; yield 3; } var g = gen(); g.next() // {value: 1, done: false} g.return('foo') // {value: 'foo', done: true} g.next() // {value: undefined, done: true}
function* gen(){ try{ yield 1; }finally{ yield 2; } yield 3; } var g = gen(); g.next() // {value: 1, done: false} g.return(10) // {value: 2, done: false} g.next() // {value: 10, done: true}
function* outer(){ yield 1; yield inner(); return 3; } function* inner(){ yield 2; } var o = outer(); o.next(); // {value: 1, done: false} o.next(); // {value: inner, done: false} o.next(); // {value: 3, done: true}
yield*
解決function* outer(){ yield 1; yield* inner(); // 調用方法與上面不一樣 return 3; } function* inner(){ yield 2; } var o = outer(); o.next(); // {value: 1, done: false} o.next(); // {value: 2, done: false} // 返回結果與上面不一樣 o.next(); // {value: 3, done: true}
function* demo(){ yield* [1, 2, 3]; } var d = demo(); d.next(); // {value: 1, done: false} d.next(); // {value: 2, done: false} d.next(); // {value: 3, done: false} d.next(); // {value: undefined, done: true}
function* outer(){ yield 1; var i = yield* inner(); yield 2 + i; } function* inner(){ return 2; } var o = outer(); o.next(); // {value: 1, done: false} o.next(); // {value: 4, done: false}
let obj = { * gen(){ yield 1; } }; var g = obj.gen(); g.next(); // {value: 1, done: false}
function* render(){ showLoading(); var res = yield getData(); hideLoading(); console.log(res); // 打印ajax的結果 } function getData(){ $.ajax().done(function(res){ r.next(res); }); } var r = render(); r.next();
// callback方式 function step(){ step1(function(res1){ step2(res1, function(res2){ step3(res2, function(res3){ console.log(res3); }) }) }) } // promise方式 function step(){ step1() .then(step2) .then(step3) .then(function({ // do something })) } // Generator方式 function step(){ var res1 = yield step1(); var res2 = yield step2(res1); var res3 = yield step3(res2); }
function execTaskA(){ return new Promise(function(resolve, reject){ if(true){ resolve('a') } }) } function execTaskB(){ return new Promise(function(resolve, reject){ if(true){ resolve('b') } }) } function* execTasks(){ var [resA, resB] = yield [execTaskA(), execTaskB()]; // let resB = yield* execTaskB(); console.log(resA, resB); } var t = execTasks(); t.next();
co
組件