Clojure 在JVM中将数据流传输到调用者

Clojure 在JVM中将数据流传输到调用者,clojure,stream,jvm,core.async,Clojure,Stream,Jvm,Core.async,我有一个函数,它定期获取数据,然后停止获取数据。此函数必须将其定期获取的数据返回给函数的调用方 当它变得 一枪 第二种方法是一种简单的实现方法,即阻塞调用者,获取所有数据,然后一次性发送 但是我想实现第一个(我想避免回调)。这里要用的东西是什么?如果是,怎么做?如果不是,如何返回调用方可以查询数据的内容,并在返回没有更多数据的信号时停止 注意:我在JVM生态系统中,具体来说是clojure。我已经看过clojure库core.async,它解决了通道使用中的此类问题。但我在想是否还有其他类似的方

我有一个函数,它定期获取数据,然后停止获取数据。此函数必须将其定期获取的数据返回给函数的调用方

  • 当它变得
  • 一枪
  • 第二种方法是一种简单的实现方法,即阻塞调用者,获取所有数据,然后一次性发送

    但是我想实现第一个(我想避免回调)。这里要用的东西是什么?如果是,怎么做?如果不是,如何返回调用方可以查询数据的
    内容,并在返回没有更多数据的信号时停止

    注意:我在JVM生态系统中,具体来说是clojure。我已经看过clojure库
    core.async
    ,它解决了通道使用中的此类问题。但我在想是否还有其他类似的方法(假设streams是可以使用的)。
    Java代码片段

    //Function which will periodically fetch MyData until there is no data
    public Stream<MyData> myFunction() {
    ...
    }
    
    myFunction().filter(myData -> myData.text.equals("foo"))
    
    
    //函数,它将定期获取MyData,直到没有数据为止
    公共流myFunction(){
    ...
    }
    myFunction().filter(myData->myData.text.equals(“foo”))
    
    您可能需要检查(似乎不再维护?

    也许您可以使用
    seq
    ——默认情况下它是惰性的(如流),以便调用方可以决定何时将数据拉入。当没有更多数据时,
    myFunction
    可以简单地结束序列。在执行此操作时,您还可以在
    myFunction
    中封装一些优化,例如批量获取数据,以最大限度地减少往返。或者根据原始要求定期获取数据

    下面是一个简单的实现:

    (定义我的函数[]
    (让[第100批]
    (->>(范围)
    (映射#)(让[从(*批次%)
    至(+从批次中)]
    (数据库从获取到)))
    ;在我们从db get获取数据时进行
    (暂时停止身份)
    ;;返回为单个序列/流
    (应用concat)))
    ;; 将其用作普通序列/流
    (->>(我的功能)
    (过滤奇数?)
    
    其中
    db get
    类似于:

    (defn db get[from to]
    ;仅返回前1000条记录,即返回零表示完成
    (当(<从1000开始)
    ;返回一系列记录
    (范围从到)
    
    这里不能使用流式解决方案吗?我不想在这里使用可观测数据,一个通道可能是一个很好的解决方案,但我建议查看Rx,因为它看起来像是一个更接近的匹配,但你必须做出判断
    core.async
    也很适合,如果您可以调用一个函数,该函数将返回一个通道,其中0个或更多值将在将来可用。记住,渠道就像一条传送带,所以它们不能永远增长。这里有一个很好的教程:您需要更具体地了解调用/下游代码的外观。除了
    core.async
    ,您还可以返回一个
    future
    ,例如。@AlanThompson什么的未来?这就是问题所在
    myFunction
    最终将返回
    MyData
    数组/Seq/List
    ,但是
    MyData
    的每个块在单独的时间帧内可用。例如,返回一个
    Future
    是不可取的,因为当Future完成时,我会再次得到
    MyData
    的所有块作为列表。相反,我希望能够在获取
    MyData
    块时将其传递给调用方,让调用方收集所有数据,并将其作为列表或以他们希望的方式进行处理。如果我删除行
    apply concat
    ,您的答案就会起作用。在返回之前,它将等待所有结果。不知道为什么会这样?