Nashorn - 同步 Java 与异步 Java 脚本阻抗不匹配
Nashorn - Synchronous Java vs Async Javascript impedance mismatch
我有一个 Java 项目使用 Nashorn 运行 一些 java 脚本代码专门用于利用一些 JS 库。
我面临的问题是我的 Java 应用程序是一个接收 HTTP 请求并响应的同步应用程序。然而,在 Java 脚本中通常有接收回调的库。
所以我的问题是:
- 如何处理同步 java 和异步 java 脚本之间的阻抗不匹配。有没有办法等待回调被调用,然后才响应?
- 如何将 Java 回调传递给 Java 脚本函数?
- 或者有没有办法阻止 Java 脚本代码直到回调完成?
示例代码如下。该项目实际上是在 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
function or (as Clojure promise object implements IFn
) by calling it with the result (clojureCallback.invoke(result)
in Javascript code). Then the result can be deref
ed 提交承诺结果(@
是 deref
的 reader 宏)。
我有一个 Java 项目使用 Nashorn 运行 一些 java 脚本代码专门用于利用一些 JS 库。
我面临的问题是我的 Java 应用程序是一个接收 HTTP 请求并响应的同步应用程序。然而,在 Java 脚本中通常有接收回调的库。
所以我的问题是:
- 如何处理同步 java 和异步 java 脚本之间的阻抗不匹配。有没有办法等待回调被调用,然后才响应?
- 如何将 Java 回调传递给 Java 脚本函数?
- 或者有没有办法阻止 Java 脚本代码直到回调完成?
示例代码如下。该项目实际上是在 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
function or (as Clojure promise object implements IFn
) by calling it with the result (clojureCallback.invoke(result)
in Javascript code). Then the result can be deref
ed 提交承诺结果(@
是 deref
的 reader 宏)。