我在包装JS库时遇到了一些麻烦,因为我无法使.done回调正常工作。在JavaScript中,代码如下所示:
db.values("inventory").done(function(item) {
console.log(item);
});
所以我尝试了一些(非常脏的)ClojureScript方法来翻译它:
(defn log []
(console/log "working?"))
(defn stock []
(#(.done % log) (.values db "inventory")))
和
(defn stock []
(js* "db.values('inventory').done(function(item) {
console.log(item);
})"))
但这些都没有奏效。错误消息总是类似于:db.values(...)。done不是函数
是否有可用于覆盖JS回调的协议扩展(或其他任何内容)?否则,可以goog.async.Deferred再次以某种方式拦截回调?
答案 0 :(得分:3)
也许这会对你有所帮助! 我已经完成了节点,但它必须在浏览器中使用一些细节
首先为演示代码我准备了一个模拟js lib来模拟你的(my_api.js)
这是my_api.js
console.log("my_api.js");
var db={};
db.item="";
db.values=function(_string_){
db.item="loadign_"+_string_;
return this;
};
db.done=function(_fn_){
_fn_(db.item);
};
var api={hello:"ey ", db:db};
module.exports=api;
// your pretended chain calls
// db.values("inventory").done(function(item) {
// console.log(item);
// });
来自clojurescript代码......
(ns cljs-demo.hello)
(defn example_callback []
(let [my-api (js/require "./my_api") ; the api.js lib used for this example
db (aget my-api "db") ; this is your db object
my_fn (fn [item] ;this is your callback function
(println "printing from clojurescript" item)
)
]
(do
(-> db (.values "inventory") (.done my_fn)) ;; calling your js in a similar way you want in js
;; or
(.done (.values db "inventory_bis") my_fn) ;; calling nested form in the standar lisp manner
)
)
)
(set! *main-cli-fn* example_callback) ;default node function
从控制台(node.js)
node your_output_node.js
你将获得
printing from clojurescript loadign_inventory
printing from clojurescript loadign_inventory_bis
祝你好运,
胡安