如何在Petriflow中使用async.run修改数据值?
问题根因
async.run属于非阻塞异步逻辑,主流程不会等待异步块执行完成,就会走完当前action的生命周期,框架会提前把还没被修改的旧text值持久化到Mongo。等异步块完成text值修改时,已经没有自动持久化逻辑触发,所以数据库字段不会更新。- 若
change text value仅修改了内存中的对象属性,没有主动触发数据库写入操作,也会导致变更无法同步到Mongo。
解决方案
方案1:同步执行修改逻辑
如果没有必须后台异步执行的强需求,直接把修改逻辑放到主流程中即可,框架自动持久化时会抓取最新值:
text: f.text; // 同步修改值 text = "My async text";
方案2:异步块内主动触发数据库写入
如果确实需要异步执行,在修改完值后手动调用Mongo的更新接口,主动把变更写入数据库:
text: f.text; async.run { const updatedText = "My async text"; change text value { return updatedText } // 替换为你实际使用的集合名、记录ID字段即可 await db.collection('你的集合名称').updateOne( { _id: 当前记录的ID }, { $set: { text: updatedText } } ) }
方案3:等待异步逻辑执行完成再结束主流程
如果想复用框架的自动持久化能力,添加await等待异步块执行完成,再走后续的持久化流程:
text: f.text; // 等待异步逻辑执行完成 await async.run { change text value { return "My async text" } }
注意:如果当前运行环境不支持顶层await,需要把整段逻辑包裹在async函数中执行。
内容的提问来源于stack exchange,提问作者Ľuboš Petrovič
相关产品推荐
相关产品推荐

