如何在不改变输入功能的情况下实现发电机的正确工作?



从某个组件中,我将发送一个具有特定名称的字符串,并将返回一些数据集(如果此名称在对象键中(。如果对象属性包含一个数组,其中包含几个具有相同结构但不同值的对象,我想在每次调用时发送下一个对象。

但是当我尝试这样做时,我每次都会得到相同的值:

{ value: { a: 1 }, done: false }
{ value: { a: 1 }, done: false }
{ value: { a: 1 }, done: false }

而不是:

{ value: { a: 1 }, done: false }
{ value: { a: 2 }, done: false }
{ value: { a: 3 }, done: true}

那么如何在不更改这部分代码的情况下获得我上面描述的预期结果:(以及对象"模拟"属性的名称(foo、bar、baz((

for (let i = 0; i < 3; i++) {
foo.Query('c');
}

您可以运行并查看结果的所有代码

const test = {
a: { id: 1 },
b: { id: 2 },
c: [{ a: 1 }, { a: 2 }, { c: 3 }]
};
function* generLoop(elem) {
// eslint-disable-next-line no-undef,no-restricted-syntax
for (el of test[elem]) {
// eslint-disable-next-line no-undef
yield el;
}
}
function createLoop(elem) {
let gen;
if (elem === 'c') {
gen = generLoop(elem);
}
console.log(gen.next());
return () => (gen ? gen.next() : test[elem]);
}
const iterators = {};
const mocks= {
Query: elem => ({
foo: test.a,
bar: test.b,
baz: createLoop(elem)
})
};
for (let i = 0; i < 3; i++) {
mocks.Query('c');
}

更改Query,以便在查询项目时,它会查找该项目的当前迭代器(如果存在((如果不存在,则创建新的迭代器(。然后在Query内部(而不是在createLoop内部(记录调用迭代器的结果,其工作只是创建迭代器(:

const test = {
a: {
id: 1
},
b: {
id: 2
},
c: [{
a: 1
}, {
a: 2
}, {
c: 3
}]
};
function* generLoop(elem) {
// eslint-disable-next-line no-undef,no-restricted-syntax
for (el of test[elem]) {
// eslint-disable-next-line no-undef
yield el;
}
}
let gen;
function createLoop(elem) {
if (elem === 'c') {
gen = generLoop(elem);
}
return () => (gen ? gen.next() : test[elem]);
}
const iterators = {};
const foo = {
Query: elem => {
iterators[elem] = iterators[elem] || createLoop(elem);
console.log(iterators[elem]());
}
};
for (let i = 0; i < 3; i++) {
foo.Query('c');
}

或者,如果迭代器缓存功能必须在奇怪命名的createLoop函数中完成(所述函数更恰当地命名为iterateLoop或其他东西,因为实现要求它只迭代,但不一定每次调用时都创建迭代器(:

const test = {
a: {
id: 1
},
b: {
id: 2
},
c: [{
a: 1
}, {
a: 2
}, {
c: 3
}]
};
function* generLoop(elem) {
// eslint-disable-next-line no-undef,no-restricted-syntax
for (el of test[elem]) {
// eslint-disable-next-line no-undef
yield el;
}
}
let gen;
function createLoop(elem) {
if (!gen) {
gen = generLoop(elem);
}
return gen.next();
}
const mocks= {
Query: elem => ({
foo: test.a,
bar: test.b,
baz: createLoop(elem)
})
};
for (let i = 0; i < 3; i++) {
console.log(mocks.Query('c').baz);
}

相关内容

最新更新