Понимание ключевого слова "доходность" в JavaScript?

Я наткнулся yield Ключевое слово в JavaScript сегодня, и я знаю, что в настоящее время он не поддерживается в браузерах, которые не обновлены ECMA 6. Тем временем в Firefox, как я могу переписать следующий код без yield

if (currentNode) {
   yield currentNode;
   currentNode = null;
}

1 ответ

Решение

Прямого эквивалента нет. Однако его можно подделать, вернув объект-генератор. По сути, код продолжения перемещается в next() генератора.

Рассмотрим пример с fib-генератором на 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
Другие вопросы по тегам