javascript - csv-parse 模块 (npm) 引用的回调函数中更新的全局变量未更新
问题描述
作为与客户合作的项目的一部分,我正在他们的引擎上开发一个工作流(部分构建在 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 的并发和事件循环模型。
推荐阅读
- c# - ASP.NET MVC WebAPI JsonContent 返回流不是 WebServer 预期的 JSON
- java - 无法在 Spring Boot 中反序列化嵌套对象“Role”
- php - 使用 MySql 连接登录 PHP
- html - 我可能以错误的方式使用 div 标签请告诉我正确的方式
- firebase - 在 Firestore Vue 中使用自定义键
- android-studio - 创建没有 Counter Project 模板的项目
- php - 记录在查看页面上获得了两次
- vb.net - 尝试...抓住:性能
- java - 当我将实体转换为 Json 时,为什么 LocalDate 格式会发生变化?
- python - 函数中的列表理解