Nashorn - 同步 Java 与异步 Java 脚本阻抗不匹配

Nashorn - Synchronous Java vs Async Javascript impedance mismatch

我有一个 Java 项目使用 Nashorn 运行 一些 java 脚本代码专门用于利用一些 JS 库。

我面临的问题是我的 Java 应用程序是一个接收 HTTP 请求并响应的同步应用程序。然而,在 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 derefed 提交承诺结果(@deref 的 reader 宏)。