Возвращаемое значение из обратного вызова JavaScript - PullRequest
0 голосов
/ 25 июня 2018

У меня проблемы с возвратом значения из обратного вызова.Я использую https://github.com/transducer/cljs-iota, который является оберткой вокруг библиотеки JavaScript IOTA.

Мой код:

(defn find-transactions 
    "search transactions associated with an address and return a vector of hashes" 
    []
            (println "finding transactions")
            (iota-api/find-transactions eff.views/iota-instance {:addresses (list comment-address)} find-callback)
          )

И функция обратного вызова:

(defn find-callback [err hashes]
          (prn  "transactions found" hashes)
          hashes
    )

Если я это сделаю

(.log js/console "result is" (find-transactions))

Обратный вызов выводит на консоль:

"transactions found" ["JW9QTNHDLGQYKGHLYHWHYRKTTEVUVBZSHNMLCDLBWVYPROKTCDRAMFGXMIQCEM9YIRXUSZJTEKG999999" "UTJ9YBLCE9RJIERRBX9HFANUYFALKZJHAPXWHQKS9KQJEKUQOTLDTSCKAM9KIFPNRXSEJCHTUJT999999" "PYWIZA9JAIPDEQBTMHSXVSKOLYGSNSMVQKOBT9WXHEFLFYCKEVPPRMGQXCBMACKSGJDQKTCUZXH999999" "XJPCFXWELTKSNCCZQM9QNTFMSRMNAEJ9WJWQERLMDSHQTGGQQHKZRZRANGRRXXTGSUNBSDFDBAC999999" "WVQIPEZZUPYODYFO9KYAIEQYPTGIMKDXGRPGF9ADDVKGGMRFKKASXQLKATFDIJJPWLOPSPPYURDSA9999" "QYKZWELJYAMWPITSTZSXLFFERSGRPBKIOCHSE9KLENRXNBXSGSLBEYW9JUVJYP9QWBJJFKMSUDA999999"]

, что является желаемым результатом, но я получаю "result is" undefined.

Я был заблокирован на это в течение всего дня, и я не знаю, почему я не могу вернуть результат (если я пытаюсь вернуть, например, «привет», он тоже не работает), и моя функция работаетпотому что я получаю результат обратно, но не могу его вернуть ...

Если у кого-то есть предложение ...

1 Ответ

0 голосов
/ 26 июня 2018

Я уже ответил на reddit , но я добавлю здесь ответ для потомков.

При программировании в стиле обратного вызова вы не получите возврат.Обратный вызов должен вызывать эффект где-то, например, путем мутации атома, помещения чего-либо в канал core.async или разрешения обещания (возможно, с помощью библиотеки promesa. Я предпочитаю обещания, но ymmv.

(defn find-transactions
  "search transactions associated with an address and return a promise for vector of hashes" 
  []
  (println "finding transactions")
  (promesa/promise
    (fn [resolve _reject]
      (iota-api/find-transactions 
        eff.views/iota-instance 
        {:addresses (list comment-address)} 
        (fn [error hashes]
          (if (error)
            (reject error)
            (resolve hashes)))))))

(-> (find-transactions)
    (promesa/then (fn [result]
                    ; do something here with result
                    ))
    (promesa/then (fn [error]
                    ; do something with error
                    )))
...