2017-11-04 11 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); 
}) 
} 

先ほど述べたように、case文にステートメントはconsole.log(RES)は '[]' 印刷される次のよう

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は約束の配列になります - たびに1つを通してループ。 Promise.allは、すべての結果を含む配列ですべてが終了すると解決されます。

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

あなたは素晴らしいです!どうもありがとうございました。それが私の問題を解決しました。はっきりと完全な説明をありがとう – Raman

関連する問題