调用“.done”JS回调

时间:2013-08-23 20:31:42

标签: clojurescript

我在包装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再次以某种方式拦截回调?

1 个答案:

答案 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

祝你好运,

胡安