繁体   English   中英

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

[英]Nashorn - Synchronous Java vs Async Javascript impedance mismatch

我有一个使用Nashorn的Java项目,专门运行一些javascript代码以利用一些JS库。

我面临的问题是我的Java应用程序是一个接收HTTP请求并响应的同步应用程序。 但是在Javascript中,具有接收回调的库是很常见的。

所以我的问题是:

  • 如何处理同步Java和异步JavaScript之间的阻抗不匹配。 有没有办法等待回调被调用并且只有在响应之后才可以?
  • 如何将Java回调传递给Javascript函数?
  • 还是有一种方法可以阻止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函数或(通过Clojure Promise对象实现IFn )结果(Javascript代码中的clojureCallback.invoke(result)来提交。 然后可以将结果取消deref@deref的阅读器宏)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM