承诺的功能会在完全执行之前自动解析

时间:2019-07-03 17:10:13

标签: javascript jquery ajax asynchronous

我想阻止其他任何执行,直到 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);被执行,并且由于尚未定义结果,因此对我来说是一个错误。

1 个答案:

答案 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;
}

主函数调用可以保持原样。