Skip to content

Instantly share code, notes, and snippets.

@frankitox
Created December 18, 2020 15:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frankitox/2cd8f38e0e0a738c2474832f50d03515 to your computer and use it in GitHub Desktop.
Save frankitox/2cd8f38e0e0a738c2474832f50d03515 to your computer and use it in GitHub Desktop.
(defn all-settled [promises]
(js/Promise.
(fn [resFn _]
(let [state (atom {:resolutions (vec (repeat (count promises) nil))
:counter 0})
process (fn [idx type]
(fn [val]
(swap! state
(fn [{:keys [resolutions counter]}]
{:resolutions (assoc resolutions idx
{:status type
(case type
"fulfilled" :value
"rejected" :reason) val})
:counter (inc counter)}))
(let [{:keys [counter resolutions]} @state]
(when (= (count promises) counter)
(resFn resolutions)))))]
(doall
(for [[idx promise] (map-indexed list promises)]
(-> promise
(.then (process idx "fulfilled"))
(.catch (process idx "rejected")))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment