我正在尝试使用promises运行异步代码。这里的问题是甚至在回调完成执行之前就会调用响应。
注意:我在循环中编写了一个回调函数。我必须在循环结束后打印一个数组。但是在循环终止之前打印数组。
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.
代码如下:
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)正在打印'[]'。
请帮忙!
提前致谢!
答案 0 :(得分: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))