2013-06-05 6 views
2

Я столкнулся с ключевым словом yield в javascript сегодня, и я знаю, что в настоящее время он не поддерживается в браузерах, которые не обновлены ECMA 6. В то же время в светлячок, как я могу переписать следующий код без yieldПонимание ключевого слова «Выход» в javascript?

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

Вы могли бы попробовать [документации JavaScript ™] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield) – RobG

ответ

3

Там нет прямого эквивалента. Однако его можно подделать, возвращая объект «генератор». В основном, код перемещается в генератор 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 
+0

возможно объявить 'выход 'следующим образом: yield {Variable1: value, Variable2: value}; –

+0

@NobalMohan Как .. что? Я не уверен, что это значит. – user2246674

+0

Я просматривал парсер WBXML в JavaScript здесь https://github.com/mozsquib/jswbxml/blob/master/wbxml.js, и их использование 'Yield' заставило меня задуматься, чтобы понять концепцию' yield'completely –

Смежные вопросы