Skip to content

Instantly share code, notes, and snippets.

@shaunlebron
Last active July 28, 2018 07:58
Show Gist options
  • Save shaunlebron/d231431b4d6a82d83628 to your computer and use it in GitHub Desktop.
Save shaunlebron/d231431b4d6a82d83628 to your computer and use it in GitHub Desktop.
es7 vs core.async

Comparing ES7 and core.async

ES7 core.async
async function() {...} (fn [] (go ...))
await ... (<! ...)
await* or Promise.all(...) (doseq [c ...] (<! c))

async

Calling foo returns a promise receiving value 1:

async function foo () {
  return 1;
}

Calling foo returns a channel receiving value 1:

(defn foo []
  (go 1))

await

bar is parked until foo has finished:

async function bar() {
  await foo();
}

bar's go-block is parked until foo has finished:

(defn bar []
  (go
    (<! (foo))))

await all

baz waits for foo and bar to complete:

async function baz() {
  await Promise.all([foo(), bar()]);
}
(defn baz []
  (go
    (doseq [c [(foo) (bar)]]
      (<! c))))
@zonzujiro
Copy link

zonzujiro commented Mar 29, 2018

Hi! Great gist! Thank you.

And I have a question :) Promise.all will return array with results. And doseq will call <! on each channel and you will get data one-by-one, right?

But what if I need both results at the same time? Is there any way to get them?

I tried to resolve this with async/merge, but it will return a channel, from which I must get values by one at the time to.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment