作为与客户进行的项目的一部分,我正在他们的引擎(部分基于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.parse
是asynchronous
,则它总是在将来执行,这意味着stack
中的函数在处理其他消息之前先执行这是MDN文档,介绍JS的Concurrency and Event Loop Model。
关于javascript - 由csv-parse模块(npm)引用的回调函数中更新的全局变量未更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57773466/