Там нет прямого эквивалента. Однако его можно подделать, возвращая объект «генератор». В основном, код перемещается в генератор next()
.
Рассмотрим этого fib-generator example on MDN:
function fib() {
var i = 0, j = 1;
while (true) {
yield i;
var t = i;
i = j;
j += t;
}
}
var g = fib();
for (var i = 0; i < 10; i++) {
console.log(g.next());
}
И вновь написано с использованием поддельного генератора:
function fib() {
var i = 0, j = 1;
return {
'next': function() {
var yieldRet = i;
// These haven't occurred before the `yield` in the above generator,
// but it makes it easier to do it in the same order here.
// Just make sure there are no OBSERVABLE side-effects.
var t = i;
i = j;
j += t;
return yieldRet;
}
};
}
var g = fib();
for (var i = 0; i < 10; i++) {
console.log(g.next());
}
Теперь это стало немного сложнее с добавлением наблюдаемых изменяемые состояний; данный пример все равно может быть выражен как конечный автомат. Обратите внимание, что каждый next
может «продвигать» состояние.
var currentNode;
function yield1() {
var y = { next: st0 };
return y;
function st0() {
if (currentNode) {
y.next = st1;
return currentNode;
} else {
y.next = stZ;
}
}
function st1() {
y.next = stZ;
currentNode = null; // observable side-effect!
}
function stZ() {
}
}
var g = yield1();
currentNode = "x";
console.log(g.next()); // "x"
console.log(currentNode); // still "x"
g.next();
console.log(currentNode); // null
Вы могли бы попробовать [документации JavaScript ™] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield) – RobG