Как работать с javascript обещаниями в clojurescript? - PullRequest
0 голосов
/ 30 марта 2020

У меня проблема с js обещаниями: я пытаюсь преобразовать этот js код:

stripe.createToken(card).then(function(result) {
    if (result.error) {
      // Inform the customer that there was an error.
      var errorElement = document.getElementById('card-errors');
      errorElement.textContent = result.error.message;
    } else {
      // Send the token to your server.
      stripeTokenHandler(result.token);
    }

И у меня есть следующее:

(go
     (let [result (<!
                   (.createToken stripe @(subscribe [:card-element]))
                   )]
       (prn "result is" result)
       ;; (if (.-error result)
       ;;   (.textContent (js/document.getElementById "card-errors") (.-message .-error result))
       ;;   (prn "response is" (js/stripeTokenHandler (.-token result)))
       ;;   )
       )
    )

Но Я получаю «Не определен метод протокола ReadPort.take! Для типа объекта: [обещание объекта]»

Как мне выполнить js .then () часть в cl js?

1 Ответ

3 голосов
/ 31 марта 2020

Кажется, вы немного запутались с JavaScript взаимодействием. Вы можете взглянуть на Cheatsheet в разделе JavaScript Interop.

Вот несколько быстрых примеров:

JS                            CLJS

object.method(arg1, arg2) <=> (.method object arg1 arg2)
object.field              <=> (.-field object)
object.field = "foo"      <=> (set! (.-field object) "foo")
object.nested.field       <=> (.-field (.-nested object))

Чтобы улучшить читабельность, вы можете использовать -> макрос макросов :

object.nested.field       <=> (-> object .-nested .-field)

Затем вы можете переписать свой пример следующим образом:

(-> (.createToken stripe card)
    (.then (fn [result]
             (if-let [error (.-error result)]
               (-> (.getElementById js/document "card-errors")
                   (.-textContent)
                   (set! (.-message error)))
               (js/stripeTokenHandler (.-token result)))))
    ;; if there is a `catch` branch
    (.catch (fn […] …)))
...