[英]Nashorn - Synchronous Java vs Async Javascript impedance mismatch
我有一个使用Nashorn的Java项目,专门运行一些javascript代码以利用一些JS库。
我面临的问题是我的Java应用程序是一个接收HTTP请求并响应的同步应用程序。 但是在Javascript中,具有接收回调的库是很常见的。
所以我的问题是:
下面是一个示例代码。 该项目实际上在Clojure中,但是为了示例,我在Java中键入内容:
@RequestMapping(value = "/{customerId}", method = RequestMethod.GET, produces="application/json")
@ResponseStatus(value = HttpStatus.OK)
public @ResponseBody Customer getShoppingCart(@PathVariable String customerId) {
return getById(customerId).toJson();
}
public Customer getById( String id ) {
nashorn.invokeFunction("javascriptFunction", expectedCallbackFunction)
}
谢谢!
为了在Clojure中将异步转换为同步API,可以使用promise
:
JavaScript代码:
function getCustomer(id, clojureCallback) {
var jsCallback = function(result) { clojureCallback.invoke(result); };
callHttp("http://api/customer/" + id, jsCallback);
}
Clojure代码:
(def js-engine ...)
(defn get-customer-by-id [id]
(let [customer-promise (promise)]
(.invokeFunction js-engine "getCustomer" (object-array [id customer-promise]))
@customer-promise))
承诺结果可以通过调用deliver
函数或(通过Clojure Promise对象实现IFn
)结果(Javascript代码中的clojureCallback.invoke(result)
来提交。 然后可以将结果取消deref
( @
是deref
的阅读器宏)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.