我有一些代码可以接收上传的文件,执行该文件并获取输出。然后,将该输出与预期输出进行比较,以检查脚本是否按预期进行。
我现在正在尝试改善此功能,以便上载的文件将运行多次,每次都将根据不同的预期输出或“测试用例”进行检查。然后,我想将“正确”或“不正确”推入结果数组,以便最后查看该数组,并检查是否存在任何“不正确”(文件是否在任何测试用例中失败)。
这是父函数代码,它要求创建数组,并希望在创建数组后对其进行迭代。
var resultsArr = await getResults(file.name, files.length, markerDir);
//file.name is the name from the uploaded file object
//files.length is the number of subdirectories (number of testcases to run against)
//markerDir is the str path to where these testcases are stored
if (resultsArr){
for(var i=0;i<resultsArr.length;i++) {
if (resultsArr[i] == "incorrect"){
checkForMarkerCb('incorrect'); //Calls back to frontend to
break; //display result on web app
}
else if (i+1 == resultsArr.length) {
checkForMarkerCb('correct');
}
}
}
以下是在上面调用的getResults函数内部
for(var i=1; i<=fileLength; i++) {
var sampleOut = markerDir + '/test' + i + '/stdout.txt';
//Grab expected stdout.txt
var markerOut = fs.readFileSync(sampleOut, 'utf-8', function(err){
if (err){
throw err;
};
});
//Run the file and grab the output
executeFile(filename, function(fileOut){
//Compare output with sample stdout
if (markerOut == fileOut){
resultsArr.push('correct');
}
else {
resultsArr.push('incorrect');
}
});
}
//If results array has a response for each testcase
if (resultsArr.length == fileLength) {
return resultsArr;
}
按要求执行executeFile():
function executeFile(filename, execFileCb){
//pathToUpload is a str path to where the upload is stored
const child = execFile('python', [pathToUpload], (err,stdout,stderr) => {
if (err) {
throw err;
}
execFileCb(stdout); //Callback with output of file
});
}
function executeFileAsync(filename) {
return new Promise(function(resolve,reject){
executeFile(filename, function(err, data){
if (err !== null) reject(err);
else resolve(data);
});
});
}
在getResults()内部使用
var fileOut = await executeFileAsync(filename)
我希望代码等待getResults随resultArr返回,以便for循环可以迭代并检查是否有任何“不正确的”。相反,getResults将在填充resultArr之前返回。
使用一些日志记录,我发现在 getResults() for循环已经完成之后,用于检查markerOut == fileOut的代码将在最后执行。我尝试将对 executeFile()的调用设置为也可以是异步/等待,类似于 getResults()的调用方式,但仍然没有变化。
我可能没有正确使用异步/回调,非常感谢您的帮助。
答案 0 :(得分:0)
您的executeFileAsync
函数当前通过一个期望有两个参数的回调来调用executeFile
,但是executeFile
然后总是仅使用一个被解释为的参数来调用execFileCb
一个错误。它还不应在异步回调中使用throw
。
相反,将它们合并为一个函数:
function executeFile(filename) {
return new Promise(function(resolve,reject){
//pathToUpload is a str path to where the upload is stored
const child = execFile('python', [pathToUpload], (err,stdout,stderr) => {
if (err) reject(err);
else resolve(stdout); //Callback with output of file
});
});
}