├── .gitignore ├── LICENSE ├── README.md ├── examples ├── css │ └── styles.css ├── index.html └── src │ ├── examples.cljs │ └── examples │ ├── github_search.cljs │ └── replicated_search.cljs ├── project.clj └── src └── cljs_promises ├── async.clj ├── async.cljs └── core.cljs /.gitignore: -------------------------------------------------------------------------------- 1 | pom.xml 2 | *jar 3 | /lib/ 4 | /classes/ 5 | /out/ 6 | /target/ 7 | .lein-deps-sum 8 | .lein-repl-history 9 | .lein-plugins/ 10 | 11 | .nrepl-port 12 | 13 | /examples/out/ 14 | /examples/js/ 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 James MacAulay 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cljs-promises 2 | 3 | A ClojureScript library for working with JavaScript promises. 4 | 5 | ### Overview 6 | 7 | This library leverages the power of [core.async](https://github.com/clojure/core.async) to let you write promise code like this: 8 | 9 | ```clojure 10 | (cljs-promises.async/extend-promises-as-pair-channels!) 11 | 12 | (go 13 | (let [user-promise (get-user "jamesmacaulay")] 14 | (try 15 | (println (:blog ( user-promise))) 16 | (catch js/Error e 17 | (println (str "Could't get user data: " (ex-message e)))))) 18 | ``` 19 | 20 | The first line globally extends `Promise` instances to act like **read-only channels** which, once resolved, **endlessly produce the same value or error to anyone who takes from them**. Because promises have built-in error semantics which don't have any direct corollary in core.async, there are different ways that we can represent promise results. In this example we've extended promises in a way that values taken from them with core.async are actually `[value error]` pairs, where you get `[value nil]` from a fulfilled promise and `[nil error]` from a rejected promise. 21 | 22 | `` is a macro provided by `cljs-promises.async` which takes one of these pairs from a promise with core.async's ` 2 |
3 | 4 | 5 | 6 | 7 | 8 |