从上面我们可以看到,通过Coroutine这种方式可以用来合并Generator和Promise。这样看起来不错,其实还有一种更好的实现方案,就是使用Channel来合并Generator。 Generator and Channel Don’t combine Generators with Promises, combine them with Channels! -- David Nolen 来自ES6 Generators Deliver Go Style Concurrency 在之前所以处理异步的方法大家基本都知道(比如神奇的setTimeout),有趣的是channel像是事后才给js加上去的。Clojure 通过 core.async 以及 Go 通过 goroutines 已经对 channels 提供支持有一段时间了。 这里有很多关于这方面的文章,其中最显著的一篇是James Longster的Taming the Asynchronous Beast with CSP Channels in Java这篇文章。大家通过这篇文章可以对Channel有一个更深的理解。 这是我直接从James Longster那篇文章中摘抄的一句话: Typically channels are useful for coordinating truly concurrent tasks that might run at the same time on separate threads. They are actually just as useful in a single-threaded environment because they solve a more general problem of coordinating anything asynchronous, which is everything in Java. 当你阅读Channel相关文章时候,你也会经常会看到CSP这个词,它的意思是Communicating Sequential Processes,我推荐读David Nolen的Communicating Sequential Processes这篇文章对其有一个更好的理解。 我们将会使用GitHub - ubolonton/js-csp: CSP channels for Java (like Clojure's core.async, or Go这个库来示范使用Channel对我们到底有什么好处。 通过Channel来进行进程通信,典型的Channel常常会提供一组函数,但是到目前为止,我们只需知道put和take的用法就好,入栈使用push,通过take有一个过程在另一边等待。很快我们将会看到更清晰的细节,首先我们需要考虑的是我们有一个channel和consumer,atv直播,如下是js-csp文档中的简化版例子:
我们可以创建一个缓冲区大小为1的Channel,接着我们通过前缀yield调用put,将42这个值传递到Channel。接着我们从Channel中take这个值并最后关闭Channel,在Channel已经关闭后,接下来yield不会产生影响。 下面这个例子是直接从js-csp文档中拿过来的。
通过调用go我们生成了一个Goroutine,它会立即返回一个Channel,使我们通过take从Channel获取任何值。 为了了解这一切如何和UI相搭配,可以看看下面这个listen函数。
我们可以通过使用listen将一个元素转换成channel。可以通过在channel上面使用take来监听所有的改动。无论我们在input框里面输入什么,我们可以通过channel获取到改动并更新到显示元素上。
Using Generators and Channels with React 到目前为止,已经将基础部分介绍完毕,同时对为什么Channel和Generator在Java中有意义有一个更深的理解,我们可以将学到Channel和Generator用到实际代码情景中。 一个经典的例子就是计数器组件,虽然很基础,只能够增加和减少数字并将当前数字显示出来,但是通过这个可以帮助我们对React渲染Component获得更清晰的认识。 你可以从 Stefan Oestreicher的elmar.js/SimpleCounter.js中获得完整代码。 AppStart用来处理顶层React Component的初始化渲染,和开启一个用来等待任何在AppChannel上的更新的Goroutine。 AppChannel是一个没有任何缓冲或其他特殊性的函数。所以我们可以做的是一旦有一个event引发了一个action变化,j2直播,我们在AppChannel使用put方法都获取到。
你可以从这里获取以上的代码. (责任编辑:本港台直播) |