从功能中获得相同的输出*(发电机)

时间:2018-07-07 22:47:39

标签: javascript jquery

我有问题,我不知道自己在做错什么。

工作示例:

function* range(start) {
	let value = +start;
	while (true) {
		const str = "" + value;
		yield "0".repeat(start.length - str.length) + str;
		value++;
	}
}

function GenerateNumber(str) {
	var iterator = range(str);
	var interval = setInterval(() => {
		console.log(iterator.next().value);
	}, 1100);
}

GenerateNumber("0137");

非工作示例:

function* range(start) {
	let value = +start;
	while (true) {
		const str = "" + value;
		yield "0".repeat(start.length - str.length) + str;
		value++;
	}
}

function repeat(str) {
	setTimeout(function() {
		console.log(str);
		GenerateNumber(str);
	}, 1500);
}

function GenerateNumber(str) {
	var iterator = range(str);
	repeat(iterator.next().value);
}
GenerateNumber("0137");

正如您在第一个示例中看到的那样,数字增加了应有的数量,但是当我尝试在每个函数调用中增加数字时,它会显示相同的值。即使将.next()。value设置为函数参数。

1 个答案:

答案 0 :(得分:1)

每次调用GenerateNumber()时,您都在创建一个新的迭代器,它从头开始:

function GenerateNumber(str) {
    var iterator = range(str);  // <-- creates a brand new iterator
    repeat(iterator.next().value);
}

您需要继续在同一迭代器上调用next()。例如,如果您检查iterator是否已分配:

function* range(start) {
	let value = +start;
	while (true) {
		const str = "" + value;
		yield "0".repeat(start.length - str.length) + str;
		value++;
	}
}

function repeat(str) {
	setTimeout(function() {
		console.log(str);
		GenerateNumber(str);
	}, 1500);
}

var iterator
function GenerateNumber(str) {
	iterator = iterator || range(str); // << -- do we alreay have an iterator?
	repeat(iterator.next().value);
}
GenerateNumber("0137");