2014-02-18 2 views
6

나는 아마도 "공동"와, yield를 통해 약속의 값을 얻는 방법을 알아 내려고 노력하고있어를 통해 약속의 가치 방법 :수율 및 공동

function *(){ 
    var someVar = yield functionThatReturnsAPromise(); 
} 

호출 된 함수가 생성되지 않습니다, 그냥 정상적인 기능. 위의 경우 someVar == Promise이지만 해결 된 값을 원합니다. co 또는 다른 라이브러리에이 방법이 있습니까?

+0

아니오,'someVar == Promise'는 사실이 아닙니다. 'somevar'는 반복자를 호출하는 함수가'next'를 사용하여 반환 된 값을 얻은 후에'next'에 매개 변수로 전달 된 값과 같습니다. –

+0

@torazaburo - 당신 말이 맞아요.하지만 이건 거의 2 년전의 대답입니다. 실제 질문과 관련이없는 내용은 부적합합니다. –

답변

7

예, co이 가능합니다. 당신은 co 호출 내에서 부모 함수를 래핑해야합니다 :

co(function *(){ 
    var someVar = yield functionThatReturnsAPromise(); 
})() 

someVar

안에 해결 값이됩니다. 약속이 거부되면 기본 try {} catch (e) {} 문으로 오류를 찾아 낼 수 있습니다.

+1

은'약속 { }' – Marek

7

일반적으로 yield 작업은 생성자의 호출 함수에 대해 자체 값 지정 실행 (yield 함수의 왼쪽 편)에 동일한 값을 반환합니다.

function* inc() { 
    var g = 0; 
    while (true) { 
     g = yield g + 1; 
    } 
} 

var incGen = inc(); 
for (i = incGen.next().value; i <= 5; i = incGen.next(i).value) { 
    console.log(i); //        ^input of generator is last output 
} 

그러나, 호출 함수는 또한 호출 할 수있다 : 1 내지 5 예와 수율의 입력을 계산이 간단한 예에서, 상기 발전기의 실행 경로뿐만 아니라 발전기 함수 수율의 출력은 출력을 마지막 값으로 다른 값으로 대체하거나 생성기의 실행에 예외를 던지십시오. 약속의 경우 약속을 반환하는 기능은 약속 자체 대신 약속의 결과를 산출 할 수 있습니다. 이 경우 그래서 :

var someVar = yield functionThatReturnsAPromise(); 
    ^output != ^input 

당신은 수율이 입력으로 약속을 받아 발전기 함수의 출력으로 해결 약속을 반환하는 함수 역할을합니다.

그렇게되면 co이 정확하게 수행 할 수 있습니다. 이 여기에, 작동하는 함수의 예 어떻게

co(function *(){ 
    var someVar = yield functionThatReturnsAPromise(); 
}) 

더 잘 이해하기 위해 공동으로 같은 일을 :

function async(makeGenerator){ 
    return function(){ 
    var generator = makeGenerator.apply(this, arguments) 

    function handle(result){ 
     if (result.done) return result.value 

     return result.value.then(function (res){ 
     return handle(generator.next(res)) // <- sets output of yield to the promise result 
     }, function (err){     // and returns input promise 
     return handle(generator.throw(err)) // <- throw promise exception to generator function 
     }) 
    } 

    return handle(generator.next()) // <- first time call, input of yield is a promise 
    } 
} 
당신이 할 필요가 co 기능 발전기 기능을 공급한다

source is from Forbes Lindesay's now famous presentation about this concept

+1

* 일반적으로 yield는 생성자의 호출 함수에 대해 자신의 일시 중지 된 실행 (yield 함수의 왼쪽 편)에 동일한 값을 반환하는 함수로 작동합니다. 이 간단한 예제에서 yield의 입력은 생성기 함수의 출력뿐만 아니라 생성자의 실행 경로 *에도 적용됩니다. 사실 나는이 문장을 분석 할 수 없다. 그러나 그것이 잘못되었다고 생각합니다. –

+0

생성자가 아닌 함수 인 'inc'에서는 yield를 사용할 수 없습니다. –

+1

@ HåvardGeithus 수정 –