到目前为止,我已经成功地使用了Autowire和uPickle的组合来对Spray路由器进行Ajax调用——请看这里的示例。使用这种方法没有阻塞,因为返回到客户端/浏览器的结果是Scala的未来——基本上浏览器应用程序将在适当的时候被告知结果,无论是失败还是返回了一个"大列表"。
我的问题是,浏览器得到整个"大列表的项目"的结果返回一次。我想做一个查询,返回一个可观察对象,或流。这将使UI能够在用户观看时动态填充。在这种情况下,客户端将在每个项目返回时得到通知(或者每几个项目,将由客户端决定如何与数据"管道"交互)。
在Scala.js应用程序中启用流到客户端的最简单的方法是什么?
编辑这个问题有两个方面,所以为了简单起见,一个回答概述了客户端的代码将被接受。服务器端总是可以是另一个SO问题…
原则上,最习惯的方法似乎是使用Websocket,但这需要服务器支持Websocket。在IIRC中,Spray没有Websockets,但它们最近被添加到akka-http中,这是Spray的替代品。
除此之外,它可能可以使用像这样的技术来完成,但它并不完全优雅。不过,我认为围绕这种技术编写Scala.js shell并不难。
请注意,这个问题实际上与Scala.js本身没有什么关系。SJS可以做JavaScript可以做的事情。关键的问题是,是否有一种很好的方法可以从JavaScript中满足您的需求。
也就是说,Autowire对于这个目的可能是错误的——它是一种RPC机制,这意味着根据定义它总是返回完整的结果。它不太适合流媒体,至少现在还不适合。这个在未来可能会改变,如果我们弄清楚如何使Autowire适应Akka流,这样一个Autowire调用就可以返回一个流,但是我们还没有开始讨论这意味着什么——真正的流支持即使在服务器上也是相当新的,仍然在讨论客户端-服务器使用