Right!  The proposal mentions that go-blocks must check for a closed 
channel at every step in order to exit early. So I'll revise the 
title—core.async cannot stop *arbitrary* go-blocks.

For example, with this staggered animation code, it's not immediately clear 
to me how to exit after any step. In JS, it pulls the plug for free.

(go
  (dotimes [_ 3]
    (swap! game assoc :board cleared)
    (<! (timeout 170))
    (swap! game assoc :board board)
    (<! (timeout 170)))
  (swap! game assoc :board cleared)
  (<! (timeout 220))
  (swap! game assoc :board collapsed))


Anyone coming from the Unity game engine will recognize this feature as the 
StopCoroutine function. Core.async does not have such a feature.  the 
ergonomics matter!

On Friday, May 25, 2018 at 3:28:49 AM UTC-5, Thomas Heller wrote:
>
>
>> not quite! core.async doesn't allow you to cancel a go-block (to my 
>> knowledge), which JS allows.  I added a section on this:
>>
>>
>> https://beta.observablehq.com/@shaunlebron/proposal-generators-and-async-functions-in-clojurescript#coreasync
>>
>>
> This is incorrect. Closing a channel can be used to "end" a loop. In 
> addition it is possible to use alt! or alts! with an additional "control" 
> channel (or more) and "selecting" which channel to work on.
>
>
>
> (defn foo []
>   (let [ch (async/chan)]
>     (go (loop [i 100]
>           (when (pos? i)
>             (<! (async/timeout 1000))
>             (when (>! ch i)
>               (recur (dec i)))))
>         (prn :loop-terminated))
>     ch))
>
> (go (let [ch (foo)]
>       (prn (<! ch))
>       (prn (<! ch))
>       (async/close! ch)
>       (prn (<! ch))))
>
>
>  
> In addition the "loop" is dependent on the "ch" reference. If that gets 
> garbage collected the loop will be as well, similar to generators or 
> async/await.
>

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojurescript+unsubscr...@googlegroups.com.
To post to this group, send email to clojurescript@googlegroups.com.
Visit this group at https://groups.google.com/group/clojurescript.

Reply via email to