多次调用node.js async / await函数(在结束之前)

时间:2020-06-23 14:01:58

标签: javascript node.js async-await

我的主文件是一个“文件监视程序”,它正在使用“ node-watch”模块监视文件夹。对于放置在文件夹中的每个文件,它必须执行几个MSSQL调用,然后相应地处理该文件。 文件监视程序脚本如下所示:

var watch = require('node-watch');
const timestamp = require('./SHR_modules/timestamp');
const sql = require('./SHR_modules/sql');
const configuration = require('./SHR_modules/config');
const logger = require('./SHR_modules/logger');

watch('./Incoming', { recursive: true }, async function (evt, name) {

  if (evt == 'update') {
    logger.addLog(configuration.logFile.watcher, 'File found: ' + name);
    var startTime = await timestamp.dateTimeDelimited();                //capture time at proicessing start
    filePath = await name.replace(name.split('\\')[name.split('\\').length-1], '');
    fileName = await name.replace(filePath, '');
    var myLoad = await sql.readLoadSpec(fileName, filePath).catch(err => {
      logger.addLog(configuration.logFile.error, 'Error while reading Load Specs for file: ' + name);
      logger.addLog(configuration.logFile.error, err);
    });
    if (typeof myLoad !== 'undefined' && myLoad){
      console.log(evt);
      logger.addLog(configuration.logFile.watcher, 'Finished processing: ' + name);
    };
    var finishTime = await timestamp.dateTimeDelimited();                  //capture time at processing finish
  }
  else {
    logger.addLog(configuration.logFile.watcher, 'File removed: ' + name);
  }
  console.log(startTime);
  console.log(finishTime);
});

和SQL函数:

var readLoadSpec =  (fileName, filePath) => {
    return new Promise(async (resolve, reject) => {
        specIDs = await findSpecs(fileName, filePath)
        .catch(err => {
            reject(err);
            console.log(fileName + ' not found')
        });
        if (typeof specIDs !== 'undefined' && specIDs) {
            console.log('FOUND!!!!');
            var addLoadSpec = [];
            for (let i = 0; i < specIDs.length; i++) {
                console.log(specIDs);
                var tempQuery1 = `select * from LoadSpec where LoadID = ${specIDs[i]}`;
                var tempQuery2 = `select * from Mappings where LoadID = ${specIDs[i]} ORDER BY OutputColumn`;
                console.log(specIDs);     <========= code work sup to this line
                const results = await queryDB(tempQuery1);
                const resultsMapping = await queryDB(tempQuery2);
                console.log(fileName);
                console.log(results.recordset[0].OutputFileName);
                console.log(specIDs);
                const inputFrmt = {
                    name: results.recordset[0].InputFormatName,
                    format: results.recordset[0].InputFormat,
                    delimiter: results.recordset[0].InputDelimiter,
                    headerRows: results.recordset[0].InputHeaderRows
                };
.
.
.
                console.log(results.recordset[0].OutputColumnCount);
                addLoadSpec.push(loadSpec);
            };
            resolve(addLoadSpec);
        };
    });
};

因此,代码运行到我标记的行(在等待查询结果之前),然后循环回到开始。 因此,如果我将一个文件放到该文件夹​​中,则一切都很好,但是当多个文件或多或少同时到达时,syncIDs var将使用另一个文件的值,然后在查询等待部分完成后恢复代码。 syncIDs只是一个数组,所以对于文件'a.csv'来说是[1,2],对于文件'b.csv'来说是[3,4],对于文件'c.csv'来说是未定义的。因此,在从数据库获得答案之前,请执行以下循环:

specIDs = await findSpecs(fileName, filePath)
        .catch(err => {
            reject(err);
            console.log(fileName + ' not found')
        });
        if (typeof specIDs !== 'undefined' && specIDs) {
            console.log('FOUND!!!!');
            var addLoadSpec = [];
            for (let i = 0; i < specIDs.length; i++) {

获取未定义索引的错误

如何使其一一处理文件?

0 个答案:

没有答案