2

我在包装 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 is not a function

是否有任何协议扩展(或其他任何东西)可用于覆盖 JS 回调?否则,可以 goog.async.Deferred 以某种方式再次拦截回调吗?

4

1 回答 1

3

也许这对你有帮助!我已经从节点完成了,但它必须在浏览器中使用一些细节

首先对于演示代码,我准备了一个模拟 js 库来模拟你的(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

祝你好运,

胡安

于 2013-09-05T18:46:00.683 回答