我想阻止其他任何执行,直到 evaluateTestCases 函数完成,但在该函数完成之前,它会进入然后相同功能的其他函数中。
功能如下:
function evaluateTestCases(source, lang)
{
return new Promise(function(resolve)
{
for(let i=0;i<hiddenData.testCases.length;i++)
{
getOutput(source, lang, hiddenData.testCases[i].input).then(function(response){
console.log(hiddenData.testCases[i].output.toString().trim()===response.output.toString().trim());
if(hiddenData.testCases[i].output.toString().trim()===response.output.toString().trim())
{
points+=1;
}
});
}
resolve(points);e
});
}
这是函数调用:
$("#submit").on("click",function()
{
evaluateTestCases(editor.getValue(), $('#language').val()).then(function(result){
console.log(result);
});
});
现在,发生的事情是:在 evaluateTestCases 函数完成之前,console.log(result);
被执行,并且由于尚未定义结果,因此对我来说是一个错误。
答案 0 :(得分:1)
您正在循环中创建promise,但您并不是在等待它们被兑现。
使用Promise.all
(如果可能在信号完成之前触发多个getOutput
调用),或者使用await getOutput(...)
。后一种解决方案将等待每个返回的诺言得到解决,然后再继续执行循环的下一个迭代。您需要使外部函数async
:
async function evaluateTestCases(source, lang) {
let points = 0; // Not sure where you were initialising this...
for (let i = 0; i < hiddenData.testCases.length; i++) {
const response = await getOutput(source, lang, hiddenData.testCases[i].input);
console.log(hiddenData.testCases[i].output.toString().trim() === response.output.toString().trim());
if (hiddenData.testCases[i].output.toString().trim() === response.output.toString().trim()) {
points+=1;
}
});
return points;
}
主函数调用可以保持原样。