XQuery:在查询执行完成之前返回一些内容
在我的web应用程序中,整个搜索页面都是用XQuery编写的。查询不仅查找和显示结果,还将搜索词写入协议文件(在eXist db中,这可以通过XQuery:在查询执行完成之前返回一些内容,xquery,exist-db,Xquery,Exist Db,在我的web应用程序中,整个搜索页面都是用XQuery编写的。查询不仅查找和显示结果,还将搜索词写入协议文件(在eXist db中,这可以通过file:serialize-函数实现) 然而,编写协议可能需要一些时间。当然,用户不应该受到这种延迟的影响。因此,我想首先输出搜索结果,然后更新协议 我尝试在返回内容后放置协议函数,如: return $search_results,localfunction:write_protocol() (函数localfunction:write_protoc
file:serialize
-函数实现)
然而,编写协议可能需要一些时间。当然,用户不应该受到这种延迟的影响。因此,我想首先输出搜索结果,然后更新协议
我尝试在返回内容后放置协议函数,如:
return $search_results,localfunction:write_protocol()
(函数localfunction:write_protocol()
始终返回空序列()
)
但这不起作用。$search\u results
的内容仅在localfunction:write\u protocol()
完成后输出
这里有什么我能做的吗?(我知道,在PHP等更具过程性的语言中,这样的事情也是有问题的。)您可以将相关的协议数据写入数据库中的集合,而不是编写外部文件吗 然后,您可以使用XQuery触发器处理该集合并将数据写入外部文件
还可以选择使用util:log app自定义日志文件。我建议使用eXist中的调度程序模块来调度XQuery任务,以编写协议文件。调度器模块提供了几个XQuery函数,您可以从主查询中使用这些函数来调度子任务;这将异步执行到查询的其余部分。如果我理解正确,这并不是XQuery特有的。您可以将页面拆分为两个请求,首先返回快速请求,然后通过AJAX查询第二个请求。当然,将协议条目写入数据库而不是外部文件是可能的,而且可能更方便。但是,问题仍然是一样的:XQuery只会在完成执行后返回搜索结果。因此,用户必须等待协议条目写入数据库,然后才能看到搜索结果。