2017-03-13 2 views
1

이 같은 엔드 포인트와 코아 웹 서버가 가정 : 모든 작업 분명히 수행 한 후생성기 함수를 병렬로 실행하는 방법?

const perform = require(...); // some generator function 

exports.endpoint = function*() { 

    var results = yield getResults(); 

    // Respond the results 
    this.body = results; 
} 

exports.getResults = function*() { 

    var actions = [...]; 
    var results = []; 

    for (var action of actions) { 

     var result = yield perform(action); 

     results.push(results); 
    } 

    return results; 
} 

지금 클라이언트가 응답을 얻을 것이다. 그러나 각각의 행동은 이전의 완성에 달려 있습니다.

병렬로 실행할 수 있습니까?

참고 : 어떻게 든 결과를 반환하고 resolve() 할 수없는 한 약속을 사용하도록 설정할 수 없습니다.

답변

1

co는 약속에 발전기 기능을 켜 및 비동기를 실행합니다. Promise.all 모두 끝내기를 기다립니다.

exports.getResults = function*() { 

    var actions = [...]; 

    return yield Promise.all(actions.map(function(action) { 
     return co(function*() { 
      return yield perform(action); 
     } 
    })); 
} 
1

발전기가 async/await 흐름을 시뮬레이션하여, 코 루틴으로 사용하는 경우, 당신은 할 수 있어야 : 심지어

var results = yield Promise.all(actions.map(action => perform(action))); 

나 :

var results = yield Promise.all(actions.map(perform)); 

을 잘 모르겠어요 정확한 사용법에 대해서는 여기를 참조하십시오. co 또는 Bluebird.coroutine으로 발전기를 사용하면 이미 약속을 사용하고 있으므로 더 명확하게 사용할 수 있습니다.

그래서, 대신 :

exports.getResults = function*() { 

    var actions = [...]; 
    var results = []; 

    for (var action of actions) { 

     var result = yield perform(action); 

     results.push(results); 
    } 

    return results; 
} 

당신은 시도 할 수 있습니다 :

exports.getResults = function*() { 

    var actions = [...]; 

    return yield Promise.all(actions.map(perform)); 
} 
+0

문제는'perform (action)'은 일시 중지 된 Generator를 반환하고 실제'perform()'을 실행하지 않습니다. 굴복했을 때 Koa (또는 Bluebird.coroutine)는 실제로 함수를 실행합니다. –

+0

perform 함수를 실제로 실행하려면'co'lib를 사용할 수 있습니다.이 해결책이 맞습니까? '복귀 수율 Promise.all (actions.map (기능 (동작) { \t \t 복귀 공동 (함수 *() { \t \t \t 복귀 수율 (액션)을 수행; \t \t}를 \t})); ' –

+0

@ ShaiBen-Dor 네, 그렇습니다. 'co'는 그런 것들에 아주 좋습니다. 여러분은 Bluebird의'co'wrap' ('co' 모듈의 일부)와 coroutine을 사용할 수도 있습니다. http://bluebirdjs.com/docs/api/promise.coroutine.html – rsp

관련 문제