MarkLogic中如何获取xdmp:spawn-function()的返回结果
xdmp:spawn-function() 返回值获取方案
xdmp:spawn-function() 本身为异步任务调度函数,默认状态下主请求不会等待异步任务执行完成,因此无法直接拿到它的返回结果。有以下几种可行方案可以拿到执行结果:
方案1:开启result选项同步等待返回
在调用时添加 result 配置项,函数会返回一个future对象,调用 xdmp:future() 即可拿到最终返回值,示例代码如下:
let $task := xdmp:spawn-function( function() { (: 此处为异步任务执行逻辑 :) "异步任务的返回结果" }, <options xmlns="xdmp:eval"> <result>true</result> (: 可按需添加timeout配置,单位为秒 :) <timeout>30</timeout> </options> ) return xdmp:future($task)
注意:该方案会让主请求阻塞等待异步任务执行完成,相当于将异步逻辑转为同步执行,适合任务执行耗时较短、主流程依赖返回结果的场景
方案2:持久化存储中转结果
如果需要保留异步执行的特性、主请求不需要立即拿到结果,可以通过存储中转的方式实现:
- 主请求生成唯一的任务ID,调用
xdmp:spawn-function()时将任务ID传入异步函数 - 异步函数执行完成后,将返回结果写入数据库,以任务ID作为文档URI或者索引字段
- 主请求后续可以通过任务ID查询对应存储的结果数据
建议给中转结果文档设置合理的过期时间,避免无效数据占用存储空间
方案3:回调逻辑处理结果
如果不需要主请求读取结果、只需要拿到结果后做后续处理,可以直接将结果处理逻辑封装到异步函数内部,异步任务执行完成后直接触发后续处理逻辑,无需中转结果给主请求。
内容的提问来源于stack exchange,提问作者ramz123
相关产品推荐
相关产品推荐

