2017-03-04 2 views
0

아래 코드 (Javascript 동시성에서 가져옴)에서 iterable = genMap(iterable, iteratee) for-of 루프 다음에 세 개의 생성기 개체가 있어야합니다. 그러나 yield* iterable은 단일 참조입니다. 그것은 genMap에서 3 가지 값을 yield하는 방법은 무엇입니까? 고맙습니다.생성자에 의해 혼동 됨

function* genMap(iterable, iteratee) { 
    for (let item of iterable) { 
     console.log('item', item) 
     yield iteratee(item); 
    } 
} 

function composeGenMap(...iteratees) { 

    return function* (iterable) { 
     for (let iteratee of iteratees) { 
      iterable = genMap(iterable, iteratee); 
     } 

     yield* iterable; 
    } 
} 

// Our iterable data source. 
var array = [ 1, 2, 3 ]; 

var composed = composeGenMap(
    x => x + 1, 
    x => x * x, 
    x => x - 2 
); 

for (let item of composed(array)) { 
    console.log('composed', item) 
} 
// → 
// composed 2 
// composed 7 
// composed 14 
+0

'yield *'는 다른 발전기로의 실행을 연기합니다. – gyre

답변

1

yield*은 다른 발전기로 실행을 지연하거나 원하는 경우 반복 가능합니다.

즉 기술적으로 yield 하나 이상의 값 (귀하의 경우 3 개)을 의미 할 수 있습니다. the Mozilla Developer Network article on yield* 가입일

는 :

항복 * 식 발전기 또는 다른 반복 가능한 객체에 위임하는데 사용된다.

+0

그러나 나는 단지 배열 (배열)에 전달 된 하나의 인덱스를 설명하는 것 같다. 예를 들어, array의 첫 번째 값은 2이고 // 1 => 1 + 1 = 2, 2 => 2 * 2, 4 => 4-2 = 2입니다. 왜 단일 "iterable"돌연변이가되지 않습니다 ....? – bresson

+0

이 예제는 실행 순서에 대해 다음과 같이 설명합니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield%2A#Delegating_to_another_generator – gyre

+0

@bresson 모든? – gyre