【发布时间】:2019-09-03 23:36:16
【问题描述】:
作为与客户的项目的一部分,我正在他们的引擎上开发一个工作流(部分构建在 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
在此先感谢您帮助我。
【问题讨论】:
-
并非如此。问题是,在我的情况下,异步回调函数在调用 csv-parse 模块期间用作参数。在引用的问题中,使用“纯”函数时会出现问题。外部模块的使用在功能之上增加了一层复杂性。
-
无论您认为
pure与外部模块是什么,这都是关于 javascript 和异步性质的规范问题。答案很广泛,并且有各种资源的链接 -
在这个意义上,感谢您指出宝贵的信息来源。我的意思是,我的问题与另一个问题不重复。希望有人对外部模块有类似的问题,并且知道如何解决它的语法。
标签: javascript node.js csv variables asynccallback