Generator
function* 这种声明方式(function关键字后跟一个星号)会定义一个生成器函数 (generator function),它返回一个 Generator 对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| function* g(i) { yield i; yield i + i; }
let a = g(3); // console.log(a)
console.log(a.next().value); console.log(a.next().value); console.log(8888);
function *foo() { yield 1; yield 2; yield 3; return; } for(let v of foo()) { console.log(v); }
|
yield关键字使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
yield关键字实际返回一个IteratorResult对象,它有两个属性,value和done。value属性是对yield表达式求值的结果,而done是false,表示生成器函数尚未完全完成。
一旦遇到 yield 表达式,生成器的代码将被暂停运行,直到生成器的 next() 方法被调用。每次调用生成器的next()方法时,生成器都会恢复执行,直到达到以下某个值:
1 2 3 4 5 6 7 8 9 10 11 12 13
| function* dd(n){ var index = 0; while(index < n) yield index++; }
let a = dd(2);
console.log(a.next()); console.log(a.next()); console.log(a.next()); console.log(a.next()); console.log(a.next());
|
iterator js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| var c = console;
function arrayIterator(array){ var i = 0; var obj = { next: function(){ return i < array.length ? {value: array[i++], done: false} : {value: undefined, done: true}; } } return obj; }
var ai = arrayIterator(['x', 'y', 'z']);
c.log(ai.next()); // { value: "x", done: false } c.log(ai.next()); // { value: "y", done: false } c.log(ai.next()); // { value: "z", done: false } c.log(ai.next()); // { value: undefined, done: true }
|
yield “协程”(coroutine)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| var fs = require('fs'); var gen;
function run(generator) { gen = generator(); gen.next(); }
function read(file) { fs.readFile(file, function(err, data) { if (!err) console.log('read %s success!', file); gen.next(data); }); }
function write(file, data) { fs.writeFile(file, data, function(err) { if (!err) console.log('write %s success!', file); gen.next(); }); }
run(function* () { var text = yield read('yieldFile.js'); yield write('yieldFile.bak', text); });
|
1 2 3 4 5 6 7 8
| async function asynctest() { console.log('start'); await call(); await normalFunction(); await new Promise(resolve=>{ console.log('wait result'); resolve()}); console.log('end'); } asynctest();
|
- command + shift + p 命令行
- View > Appearance > Toggle Zen Mode (View > Appearance > Toggle Centered Layout)
- 在 Preferences > Settings - 插件 中打开 emmet.triggerExpansionOnTab
更多 emmet 技巧