概念
- 生成器对象是由一个generator function返回的,并且它符合可迭代协议和迭代器协议Generator | MDN
- 普通函数 VS 生成器函数
生成器函数.[[IsGenerator]]:true
- 「
把它当做一个实例.__proto__
」
- 普通函数是 Function 的实例,
普通函数.__proto__===Function.prototype
- 生成器函数是
GeneratorFunction
的实例
生成器函数.__proto__ === GeneratorFunction.prototype
GeneratorFunction.prototype.__proto__ === Function.prototype
({}).toString.call(生成器函数)
=> "[object GeneratorFunction]"
- 「把它作为一个
构造函数.prototype
」
- 普通构造函数.prototype -> 原型对象(constructor:构造函数)
- 生成器构造函数.prototype -> 原型对象(空对象:可以自己设置内容)
- 生成器函数.prototype.proto === Generator.prototype(next/return/throw/Symbol.toStringTag/Symbol.iterator…)
案例
function* func() {
}
func.prototype.xxx = 'zhufeng';
let itor = func();
console.log(itor);
console.log(({
}).toString.call(itor));
function* func() {
console.log('A');
yield 1;
console.log('B');
yield 2;
console.log('C');
yield 3;
console.log('D');
return 4;
}
let itor = func();
console.log(itor.next());
console.log(itor.next());
console.log(itor.next());
console.log(itor.next());
function* func() {
let x = yield 1;
console.log(x);
}
let itor = func();
console.log(itor.next());
console.log(itor.next(10));
function* func1() {
yield 1;
yield 2;
}
function* func2() {
yield 3;
yield* func1();
yield 4;
}
let itor = func2();
console.log(itor.next());
console.log(itor.next());
console.log(itor.next());
console.log(itor.next());
console.log(itor.next());
function* func() {
console.log(this);
yield 1;
}
let itor = func();
itor.next();
const query = x => {
return new Promise(resolve => {
setTimeout(() => {
resolve(++x);
}, 1000);
});
};
query(1).then(result1 => {
console.log(`第一个请求的结果:${
result1}`);
return query(result1);
}).then(result2 => {
console.log(`第二个请求的结果:${
result2}`);
return query(result2);
}).then(result3 => {
console.log(`第三个请求的结果:${
result3}`);
});
(async function () {
let result1 = await query(1);
console.log(`第一个请求的结果:${
result1}`);
let result2 = await query(result1);
console.log(`第二个请求的结果:${
result2}`);
let result3 = await query(result2);
console.log(`第三个请求的结果:${
result3}`);
})();
function* func(x) {
let result1 = yield query(x);
console.log(`第一个请求的结果:${
result1}`);
let result2 = yield query(result1);
console.log(`第二个请求的结果:${
result2}`);
let result3 = yield query(result2);
console.log(`第三个请求的结果:${
result3}`);
}
let itor = func(1);
itor.next().value.then(result1 => {
itor.next(result1).value.then(result2 => {
itor.next(result2).value.then(result3 => {
itor.next(result3);
});
});
});
var isPromise = function isPromise(obj) {
if ((obj !== null && typeof obj === "object") || (typeof obj === "function")) {
if (typeof obj.then === "function") {
return true;
}
}
return false;
};
function AsyncFunc(generator, ...params) {
const itor = generator(...params);
const next = x => {
let {
value,
done
} = itor.next(x);
if (done) return;
!isPromise(value) ? value = Promise.resolve(value) : null;
value.then(next);
};
next();
}
AsyncFunc(function* (x) {
let result1 = yield query(x);
console.log(`第一个请求的结果:${
result1}`);
let result2 = yield query(result1);
console.log(`第二个请求的结果:${
result2}`);
let result3 = yield query(result2);
console.log(`第三个请求的结果:${
result3}`);
yield 10;
console.log('OK');
}, 1);