关于dart2js中的处理流有类似的问题(how to process a HTTP stream with Dart)。我专注于vm。
我可以从规范中读到:
消息的内容可以是:原始值(null,num,bool,double,String),SendPort的实例,以及其元素是其中任何一个的列表和映射。列表和地图也允许循环。
在两个隔离区共享相同代码并且在同一进程中运行的特殊情况下(例如通过spawn创建的隔离区),也可以发送对象实例(将在进程中复制)。目前只有dartvm支持。目前,dart2js编译器仅支持上述限制消息。
我已经知道我无法发送到隔离区并返回以下对象:HttpRequest和HttpResponse对象,我无法发送流。
问:我真的不明白我应该如何处理隔离中的大块数据,然后将其发送回主隔离,然后将其发送回客户端。通常如果我想读取文件。我可以获取流,应用转换,然后将流传输到http响应。使用菌株的最佳做法是什么?
感谢您的帮助!
答案 0 :(得分:2)
我已经提供了一个例子,但我会快速概述一下如何实现这一点,虽然它可能不一定是最佳实践 - 它只是我个人知道的唯一方式。
我们获得了一个名为Isolate.spawnUri(Uri uri, List<String> args, dynamic message)
message
参数可以保存第一篇文章中提取的任何值。我们想要做的是在主线程中创建一个新的ReceivePort
并监听传入的数据,然后我们想要生成一个以message
作为ReceivePorts .sendPort
的隔离。
然后,隔离区应创建自己的ReceivePort
并使用消息值发送回自己的sendPort并侦听其接收端口。这基本上做的是创建双向通信。允许我们保持孤立存活并来回发送工作。
隔离区的任何响应都将来自您的原始接收端口,您要发送到隔离区的任何数据都将通过隔离区刚刚发回的发送端口。
然后,您可以直接将流数据发送到隔离区,以便随意处理,并且可以发送回数据(或者您可以在隔离区发送响应后关闭端口 - 根据您的需要提供去吧。)
我在GitHub上提供了一个例子: https://github.com/TomCaserta/ExampleIsolate
请注意,如果您希望隔离区在dart2js中运行,请务必通过以下命令在每个隔离文件上运行dart2js:
dart2js -o <filename>.dart.js <filename>.dart