我们可以使用js_of_ocaml来包装一个 JS 函数,然后在 OCaml 中调用它。当 JS 函数是异步的(即,包括承诺并需要时间)时,我无法制作一个工作示例。
我要包装的异步JS函数JSfun
如下。变量x
设置为"here"
2 秒后,这是我要返回的值。
function JSfun() {
var x = "before";
return new Promise(function(resolve, reject) {
setTimeout(function() {
append("inside setTimeout");
x = "here";
resolve(x);
}, 2000);
})
}
我们可以成功调用JSfun
JS 并按"runJS here"
预期得到:
function runJS() {
JSfun().then(function(res) {
append("runJS " + res)
})
}
但是,OCaml 很难模仿这种链接。要包装JSfun
OCaml,似乎我们必须使用:
Js.Unsafe.global##.OCamlcall := Js.wrap_callback
(fun _ ->
let m = Js.Unsafe.fun_call (Js.Unsafe.js_expr "JSfun") [||] in
Js.string ((Js.to_string m) ^ " Via OCaml")
);
除了这样调用之外,我没有其他想法:
function runOCaml() {
var res = OCamlcall("abc");
append(res);
}
不出所料,它不起作用:我们确实看到"inside setTimeout"
print 了,这证明JSfun
已被调用,但返回值不存在。
这是jsfiddle。我还做了一个包装同步 JS 函数的工作示例。在 OCaml 中,包装是:
Js.Unsafe.global##.OCamlcallSync := Js.wrap_callback
(fun _ ->
let m = Js.Unsafe.fun_call (Js.Unsafe.js_expr "JSfunSync") [||] in
Js.string ((Js.to_string m) ^ " Via OCaml")
);
那么有人有解决方案、想法或解决方法吗?