gpt4 book ai didi

javascript - 在 JavaScript 中,生成器函数中的 `return someValue` 是反模式吗?

转载 作者:行者123 更新时间:2023-12-01 16:18:24 25 4
gpt4 key购买 nike

在下文中,.next()可以显示最后一个值:{ value: 3, done: true } :

function* genFn() {
yield 1;
yield 2;
return 3;
}

const iter = genFn();
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());

但如果用作可迭代对象则不是:

function* genFn() {
yield 1;
yield 2;
return 3;
}

const iter = genFn();
console.log([...iter]);

看来随便 return value或否 return被使用,意思是 return undefined ,如果它是可迭代协议(protocol)并且因此也是迭代器协议(protocol),则不使用该值。

最佳答案

I think in other words, is return someValue in a generator function anti-pattern?



不,但你应该只在有意义的时候使用它。除了调用 .next()手动, yield*会产生它。

function* a() {
yield 1;
yield 2;
return 3;
}

function* b() {
console.log(yield* a());
}

console.log([...b()]);


一个非常实用的例子是预异步函数,其中 yield可以用作 await你仍然想返回一个值。在编写不基于 promises/thenables 的类似模式时,同样的概念仍然适用。

不受 JavaScript 调用栈限制的递归,例如:

function* sillyAdd(a, b) {
return b === 0
? a
: yield sillyAdd(a + 1, b - 1);
}

const restack = f => (...args) => {
const stack = [f(...args)];
let ret = undefined;

while (stack.length !== 0) {
let {value, done} = stack[stack.length - 1].next(ret);

if (done) {
stack.pop();
ret = value;
} else {
stack.push(value);
}
}

return ret;
};

console.log(restack(sillyAdd)(2, 100000));
console.log('(it’s synchronous)');


通过在暂停函数中保持状态进行在线解析:

function* isBalanced() {
let open = 0;

for (let c; c = yield;) {
if (c === '(') {
open++;
} else if (c === ')') {
open--;

if (open < 0) {
return false;
}
}
}

return open === 0;
}

class Parser {
constructor(generator) {
this.generator = generator();
const initial = this.generator.next();
this.done = initial.done;
this.result = initial.value;
}

write(text) {
if (this.done) {
return;
}

for (const c of text) {
const {value, done} = this.generator.next(c);

if (done) {
this.done = true;
this.result = value;
break;
}
}
}

finish() {
if (this.done) {
return this.result;
}

const {value, done} = this.generator.next();

if (!done) {
throw new Error('Unexpected end of input');
}

return value;
}
}

const p = new Parser(isBalanced);

// the product of these could be too large to fit in memory
const chunk = '()'.repeat(1000);

for (let i = 0; i < 100; i++) {
p.write(chunk);
}

console.log(p.finish());

关于javascript - 在 JavaScript 中,生成器函数中的 `return someValue` 是反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59595753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com