Использование входов и выходов функции генератора - PullRequest
1 голос
/ 01 октября 2019

Я экспериментировал с использованием функций genrator и придумал следующий генератор. Это работает, но я не понимаю, как он может использовать входные данные yield, обрабатывать их и использовать один и тот же оператор yield для вывода результата ...

Как работает поток программы?

//My caching Generator
function* cache(){
	let input, output, cache = {};
	while(true){
		input = yield output;
		//Some code...
		if(input in cache){
			output = cache[input];
			console.log("Old Value: "+output);
		}else{
			output = f(input);
			cache[input] = output;
			console.log("New Value: "+output);
		}
	}
}

//Some expensive function:
function f(x){
	return x.split("").reverse().join("");
}

const c = cache();
console.log("Return value: "+ c.next("this is lost").value);
console.log("Return value: "+ c.next("Hello").value);
console.log("Return value: "+ c.next("World").value);
console.log("Return value: "+ c.next("Hello").value);
console.log("Return value: "+ c.next("Stackoverflow").value);

1 Ответ

1 голос
/ 12 октября 2019

Я попробую:

const c = cache();
console.log("Return value: "+ c.next("this is lost").value);

Это присваивает c с функцией итератора для cache (первая строка), а затем сначала запускает cache до первого yield expressionТаким образом, в основном этот код:

let input, output, cache = {};
yield output;

output равен undefined, поэтому undefined возвращается из первого next() вызова. Однако обратите внимание, что аргумент ("this is lost") не , переданный в этот yield. Он будет передан в yield, где предыдущее выполнение было остановлено. Поскольку не было предыдущего запуска c.next, он действительно потерян.

При следующем запуске:

console.log("Return value: "+ c.next("Hello").value);

выполняется следующий код:

input = "Hello"; // the yield is substituted with the next() argument here!
//Some code...
if(input in cache){ // false
  output = cache[input];
  console.log("Old Value: "+output);
} else {
  output = f(input);
  cache[input] = output;
  console.log("New Value: "+output);
}
yield output // "olleH"

Функция возобновляется с той же строки, на которой она была остановлена ​​ранее, и yield output заменяется аргументом next(). MDN говорит:

Вызов метода next () с аргументом возобновит выполнение функции генератора, заменив выражение yield, где выполнение было приостановлено, аргументом из next ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...