Saya mencoba menggunakan paket npm di cljs yang disebut "systeminformation"
sebagian besar fungsinya async dan ada juga yang non-async
tetapi saya tidak dapat menggunakan fungsi async, semuanya berfungsi dengan baik
IMPOR TERKAIT

[clojure.core.async :as async] 
["systeminformation" :as systeminformation]

Kode yang saya coba jalankan

(comment
  (systeminformation/version) // WORKS FINE 
  (async/go
    (async/<! (systeminformation/cpu))) // Gives me error 
  )

KESALAHAN:

INFO [mutesync.inspect.electron.background.main:30] - STACK
 TypeError: c.cljs$core$async$impl$protocols$ReadPort$take_BANG_$arity$2 is not a function
    at cljs$core$async$impl$ioc_helpers$take_BANG_ (D:\Tom\mutesync\.shadow-cljs\builds\electron-main\dev\out\cljs-runtime\cljs\core\async\impl\ioc_helpers.cljs:52:1)
    at switch__47338__auto__ (<eval>:8:52)
    at <eval>:32:29
    at Function.fexpr__47378 [as cljs$core$IFn$_invoke$arity$1] (<eval>:54:4)
    at Object.cljs$core$async$impl$ioc_helpers$run_state_machine [as run_state_machine] (D:\Tom\mutesync\.shadow-cljs\builds\electron-main\dev\out\cljs-runtime\cljs\core\async\impl\ioc
_helpers.cljs:43:3)
    at cljs$core$async$impl$ioc_helpers$run_state_machine_wrapped (D:\Tom\mutesync\.shadow-cljs\builds\electron-main\dev\out\cljs-runtime\cljs\core\async\impl\ioc_helpers.cljs:45:1)
    at <eval>:84:67
    at Immediate.cljs$core$async$impl$dispatch$process_messages (D:\Tom\mutesync\.shadow-cljs\builds\electron-main\dev\out\cljs-runtime\cljs\core\async\impl\dispatch.cljs:26:7)
    at processImmediate (internal/timers.js:456:21)
ERROR [mutesync.inspect.electron.background.main:68] - uncaught error
TypeError: c.cljs$core$async$impl$protocols$ReadPort$take_BANG_$arity$2 is not a function
2
xyz xyz 4 April 2021, 15:49

1 menjawab

Jawaban Terbaik

Fungsi async di JS adalah gula sintaks untuk fungsi yang mengembalikan Promise.

core.async tidak bekerja dengan Janji secara default dan Anda perlu menggunakan fungsi pembantu untuk membuatnya bertindak seperti saluran jika Anda mau. Makro <!p melakukan ini untuk Anda.

(ns test.foo
  (:require
    [clojure.core.async :as async] 
    [cljs.core.async.interop :refer (<!p)]
    ["systeminformation" :as systeminformation]))


(async/go
  (prn (<!p (systeminformation/cpu))))

Atau Anda bisa .then atau .catch Janji dengan panggilan balik. Tidak perlu core.async saat melakukannya.

(-> (systeminformation/cpu)
    (.then prn))

Ada juga panduan yang tersedia tentang topik tersebut.

4
Thomas Heller 5 April 2021, 15:08