Fork me on GitHub
#clojure-russia
<
2016-08-27
>
potapenko12:08:36

Зачем специальные либы для промисов? Не проще промисы превратить в каналы и работать уже с комфортом через async? Я написал простую функцию await - а дальше уже clojure way.

(defn await
  [promise]
  (let [port (chan)]
    (-> promise
        (.then (fn [res] (put! port [nil res]))
               (fn [err] (put! port [err nil])))
        (.catch (fn [err] (put! port [err nil]))))
    port
    ))
использую
(let [[err res] (<! (await (any-promise-func))]
  )

niwinz12:08:37

Because channel is not a good abstraction for async value, in fact it does not has any notion of error, error propagation and composition in same way as can be done with promise or rx streams

niwinz13:08:10

csp is nice stuff but is not a silver bullet

niwinz13:08:34

in other words, is too much low-level

potapenko13:08:28

Ну не знаю. Я работаю с промисами уже года четыре, еще с ангулара, нравилось, но как пересел на async - выдохнул. Мне вполне хватает. Нужна параллельность - pmap на async.

potapenko13:08:00

может у меня цепочки не такие были длинные, и не нужно было чейнить.

niwinz13:08:50

do you know alet macro of cats? it handles the parallel stuff for you, grouping promise resolution in independent batches?

potapenko13:08:34

нет, не пробовал, погляжу, спасибо.

niwinz13:08:20

I'm active user of core.async, but using it for return one async value, it is a little bit to much low-level as I said previously, if you want apply a function over the value you should build an other glue function in order to do it ... too much boilerplate for something that is already solved with especialized abstraction

niwinz13:08:58

my opinion...

niquola17:08:04

Ну что, в понедельник делаем hangout?

artemyarulin19:08:28

у меня почти похожая история - юзал промисы и казалось манна небесная после коллбеков, но когда открыл для себя кор.асинк (а перед этим Rx.JS) ощутил на сколько ущербны уже промисы, ибо сложные процессы реализуются там на раз. Но спустя год я понял что в моем конкретном приложении 99% это асинхронные операции (весь IO на ReactNative асинхронный) с одним значением которые могут вернуть ошибку, то что промисы моделируют идеально. В будущем когда (если) притащу реактивность в UI или в каких других случаях когда нужен будет инструмент для сложных асинхронных воркфлоу - тогда верну взад кор.асинк, ну а пока промисы (и промеса) проще

dottedmag23:08:34

А некоторые люди вообще используют Control.Monad.Either и do-нотацию для операций с ошибкой troll