Clojure - получайте обновления в реальном времени с Cloud Firestore - PullRequest
0 голосов
/ 03 мая 2018

Вот интерфейс EventListener

package com.google.cloud.firestore;

    public interface EventListener <T> {
      void onEvent(@javax.annotation.Nullable T t, @javax.annotation.Nullable com.google.cloud.firestore.FirestoreException e);
    }

Вот код раздела Java (см. https://firebase.google.com/docs/firestore/query-data/listen)

DocumentReference docRef = db.collection("cities").document("SF");
    docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
      @Override
      public void onEvent(@Nullable DocumentSnapshot snapshot,
                          @Nullable FirestoreException e) {
        if (e != null) {
          System.err.println("Listen failed: " + e);
          return;
        }

        if (snapshot != null && snapshot.exists()) {
          System.out.println("Current data: " + snapshot.getData());
        } else {
          System.out.print("Current data: null");
        }
      }
    });

Вот мой преобразованный код в Clojure

(defn outlook-synced-listenning
      [^DocumentReference ref]
      (let []
        (-> ref
            (.addSnapshotListener
              (reify EventListener
                (^void onEvent [this ^DocumentSnapshot  snapshot ^FirestoreException e]

                  (if-not (nil? e)
                    (println " Listen failed: " + e)
                    )
                  (if (and (not (nil? snapshot)) (.exists snapshot))
                    (println " Current data: " + (.getData snapshot))
                    (println " Current data null ")
                    )

                )))
            )
        ))

Вот ошибка

Caused by: java.lang.IllegalArgumentException: Can't find matching method: onEvent, leave off hints for auto match.
        at clojure.lang.Compiler$NewInstanceMethod.parse(Compiler.java:8305)
        at clojure.lang.Compiler$NewInstanceExpr.build(Compiler.java:7853)
        at clojure.lang.Compiler$NewInstanceExpr$ReifyParser.parse(Compiler.java:7754)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6919)

Я думаю, что ошибка с типами параметров и подсказками типов, когда код Clojure не совпадает с интерфейсом Java.

Полагаю, что я до сих пор неправильно конвертирую приведенную ниже строку кода в Clojure docRef.addSnapshotListener (новый EventListener ()

Пожалуйста, посоветуйте мне, как я это делаю. Спасибо

1 Ответ

0 голосов
/ 04 мая 2018

Я удалил все типы параметров и подсказки типов, кроме «this». Работает нормально

Большое спасибо Фрэнку Мойеру

(defn outlook-synced-listenning
      [^DocumentReference ref]
      (let []
        (-> ref
            (.addSnapshotListener
              (reify EventListener
                (onEvent [this snapshot e]

                  (if-not (nil? e)
                    (println " Listen failed: " + e)
                    )
                  (if (and (not (nil? snapshot)) (.exists snapshot))
                    (println " Current data: " + (.getData snapshot))
                    (println " Current data null ")
                    )

                )))
            )
        ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...