繁体   English   中英

csv-parse 模块 (npm) 引用的回调函数中更新的全局变量未更新

[英]Global variable updated in the callback function referenced by the csv-parse module (npm) is not updating

作为与客户合作的项目的一部分,我正在他们的引擎上开发工作流(部分构建在 node.js 之上),但我在处理 Javascript 任务时遇到了问题。 特别是,我将一个 csv 文件accountCsv作为输入,然后我想修改一个过程变量outputFinanceAccounts ,它应该是一个包含从 csv 文件中读取的一些信息的字符串。 此外,我想将此流程变量传递给工作流的下一个活动。

在 Javascript 任务中,我使用了模块csv.parse (客户端引擎上可用的 npm 包),通常它运行良好并正确读取 csv 文件中的数据。 此函数使用异步回调函数作为参数。 此外,我正在更改此异步函数中的流程变量outputFinanceAccounts 在测试期间,我看到这个过程变量在解析块内分配了正确的值。 但是,当csv.parse函数完成工作时,过程变量outputFinanceAccounts更新值将丢失。 因此,我无法将此流程变量的任何值传递给工作流的下一个活动。

我试图创建一个嵌套函数内部csv.parse并返回该功能之外的结果csv.parse ,但它不工作。 据我了解,只有当csv.parse是一个函数时,这个技巧才会起作用,但实际上并非如此,我不知道什么是正确的语法。

const csv = require('csv');
const files = require('files')

const DepartmentColumn = 'Department'

const options = {auto_parse: true, columns: true, relax_column_count: true }

// Read the reportCsv file (workflow variable)
const csvContents = files.getContent(accountCsv.id)

outputFinanceAccounts = 'VALUE BEFORE PARSING'

console.log('Before parsing', outputFinanceAccounts);

csv.parse(csvContents.buffer.toString('utf-8'), options, (error, AccountList) => {
  if (error) {
      console.log(`Error parsing CSV: ${error}`)
      return
  }
  if (AccountList.length == 0) {
      console.log(`Error: CSV contains zero rows`)
      return
    } else {
      console.log(`${AccountList.length} rows read from CSV`)
  } 
  AccountList.forEach(account => {
   if(account[DepartmentColumn] == 'Finance'){
    outputFinanceAccounts = "VALUE INSIDE PARSING";
    console.log('Inside parsing', outputFinanceAccounts);
   }
  });
})

console.log('After parsing:', outputFinanceAccounts);

在客户端的工作流引擎(部分使用 node.js 构建)上测试代码给出以下结果:

Test execution finished successfully

Logs
-> Before parsing VALUE BEFORE PARSING
-> After parsing: VALUE BEFORE PARSING
-> 4 rows read from CSV
-> Inside parsing VALUE INSIDE PARSING
-> Inside parsing VALUE INSIDE PARSING

但我需要的是:

-> After parsing: VALUE INSIDE PARSING

在此先感谢您帮助我。

您的预期输出是不可能的。 console.log('After parsing:', outputFinanceAccounts)总是在csv.parse(...到变量更新时,控制台输出完成。

只是一个例子,但csv.parse类似于setTimeout在这里:

 let something = "initial" console.log(something) setTimeout(() => { console.log('this always runs after final console.log') something = "final" }, 0) // output is still "initial" console.log(something)

如果csv.parseasynchronous ,它总是在未来执行,这意味着stack函数在处理进一步的消息之前首先被执行

这是 MDN 文档,解释了 JS 的并发和事件循环模型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM