【问题标题】:XQuery: Return something before execution of query has finishedXQuery:在查询执行完成之前返回一些东西
【发布时间】:2015-06-30 15:35:19
【问题描述】:

在我的 Web 应用程序中,整个搜索页面都是用 XQuery 编写的。查询不仅查找并显示结果,还将搜索词写入协议文件(在 eXist db 中,这可以通过file:serialize-函数实现)。

但是,编写协议可能需要一些时间。当然,用户不应该受到这种延迟的影响。所以,我想先输出搜索结果,然后更新协议。

我试过把协议函数放在内容返回之后,比如:

return $search_results,localfunction:write_protocol()

(函数localfunction:write_protocol()总是返回空序列()。)

但这不起作用。 $search_results的内容只有在localfunction:write_protocol()完成后才输出。

有什么我可以在这里做的吗? (我知道,这样的事情在 PHP 等更流程化的语言中也存在问题。)

【问题讨论】:

  • 如果我理解正确的话,这并不是 XQuery 所特有的。您可以将您的页面分成两个请求,首先返回快速请求,然后让该页面通过 AJAX 查询第二个请求。

标签: xquery exist-db


【解决方案1】:

我建议使用 eXist 中的调度程序模块来调度 XQuery 任务来编写您的协议文件。调度器模块提供了几个 XQuery 函数,您可以在主查询中使用这些函数来调度子任务;然后,这将与您的其余查询异步完成。

【讨论】:

    【解决方案2】:

    除了写一个外部文件,你能把相关的协议数据写到数据库中的一个集合吗?

    然后您可以使用 XQuery 触发器来处理该集合并将数据写入外部文件。

    还有一个使用 util:log-app 的自定义日志文件选项。

    【讨论】:

    • 当然,将协议条目写入数据库而不是外部文件是可能的,而且可能更方便。但是,问题仍然存在:XQuery 仅在执行完成后才返回搜索结果。因此,用户在看到搜索结果之前必须等待协议条目被写入数据库。
    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多