function* and yield

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关键字使生成器函数执行暂停,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 技巧