2017-11-04 6 views
0

약속을 사용하여 비동기 코드를 실행하려고합니다. 여기서 문제는 콜백의 실행이 완료되기 전에도 응답이 호출된다는 것입니다.노드 JS에서 약속 안 함

참고 : 루프 내에서 콜백 함수를 작성했습니다. 루프가 완료되면 배열을 인쇄해야합니다. 그러나 루프가 종료되기 전에 배열이 인쇄됩니다.

router.post('/run',function(req,res){ 


    var code=req.body.code; 
    var lang=req.body.lang; 
    var input=req.body.input; 
    var result=[]; 
    switch(lang){ 
     case 1: 
    calculate(code,input).then(function(res){ 
       console.log(res); 
     }); 
    } 
}); 



function calculate(code,input){ 
    var result=[] 
return new Promise((resolve,reject)=>{ 
    for(let i=0;i<input.length;i++){ 

    compile_run.runPython(code, input[i], function (stdout, stderr, err) { 
     if(!err){ 
       console.log(stdout); 
       result.push(stdout); 
     } 
     else{ 
      console.log(err); 

     } 


    }); 
    } 
    resolve(result); 
}) 
} 

I 말했듯 케이스 문의 문 CONSOLE.LOG (입술) '[]'인쇄하고 다음과 같이

My question is : 
1) Is it correct to use a callback within a loop? 
2)If not,then what are the other methods of repeating a callback function. 

코드이다.

도와주세요!

미리 감사드립니다.

+0

_compile_run.runPython_이란 무엇입니까? – TGrif

+0

주어진 코드를 특정 언어로 컴파일하기위한 모듈입니다. (코드와 입력 모두 프론트 엔드에서 수신됩니다.) – Raman

+0

컴파일이 완료되기 전에 _ 결과를 확인하고 있습니다. – TGrif

답변

1

compile_run.runPython()은 비동기 작업이며 반복하여 여러 번 호출합니다. 즉, 각이 완료 될 때까지 까지 기다릴 수 있어야합니다. 모든 개별 비동기 작업이 반환되기 전에 약속을 해결하기 때문에 Promise에서 전체 루프를 간단하게 래핑하면 작동하지 않습니다.

이 작업을 수행하려면 에 대해 각각 비동기 작업에 대한 약속을 만들어야합니다. Promise.all()은 일련의 약속을 취하고 모든 작업이 끝나면 다시 도움을 줄 수 있습니다.

나는 그래서 이것을 실행하지 않은 compile_run에 익숙하지 해요,하지만 그것은 당신에게 좋은 출발점 제공한다 :

function calculate(code,input){ 
    var promiseArray = input.map(inp => { 
     return new Promise((resolve, reject) => { 
      compile_run.runPython(code, inp, function (stdout, stderr, err) { 
       if(!err){ 
        console.log(stdout); 
        resolve(stdout); 
       } 
       else{ 
        reject(err) 
       } 
      }) 
     }) 
    }) 
    return Promise.all(promiseArray) 
} 

promiseArray는 약속의 배열이됩니다 - 각 시간을 통해 하나를 루프. Promise.all은 모든 결과가 포함 된 배열로 모두 끝나면 해결됩니다. 그러면 다음을 사용할 수 있습니다.

calculate(code,input) 
.then(result => { 
    // use results here 
}) 
.catch(err => console.log(err)) 
+0

당신은 최고입니다! 고맙습니다. 그게 내 문제를 해결해 줬어. 명확하고 완전한 설명을 주셔서 감사합니다. – Raman