尝试等待列表填充后再遍历NodeJS

时间:2019-04-04 16:30:07

标签: javascript arrays node.js asynchronous callback

我有一些代码可以接收上传的文件,执行该文件并获取输出。然后,将该输出与预期输出进行比较,以检查脚本是否按预期进行。

我现在正在尝试改善此功能,以便上载的文件将运行多次,每次都将根据不同的预期输出或“测试用例”进行检查。然后,我想将“正确”或“不正确”推入结果数组,以便最后查看该数组,并检查是否存在任何“不正确”(文件是否在任何测试用例中失败)。

  • 我只尝试了每个函数中的回调。
  • 我尝试在getArray上使用await和async,如下所示
  • 同时使用回调和异步。

这是父函数代码,它要求创建数组,并希望在创建数组后对其进行迭代。

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()的初始函数。
  • getResults():它获取每个目录的路径并进行调用,将比较输出的结果压入结果数组。
  • executeFile():使用'child_process'运行文件并使用输出进行回调。

我希望代码等待getResults随resultArr返回,以便for循环可以迭代并检查是否有任何“不正确的”。相反,getResults将在填充resultArr之前返回。

使用一些日志记录,我发现在 getResults() for循环已经完成之后,用于检查markerOut == fileOut的代码将在最后执行。我尝试将对 executeFile()的调用设置为也可以是异步/等待,类似于 getResults()的调用方式,但仍然没有变化。

我可能没有正确使用异步/回调,非常感谢您的帮助。

1 个答案:

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