js_of_ocamlを使用してJS関数をラップし、OCaml内で呼び出すことができます。私は、JS関数が非同期(すなわち、約束を含み、時間がかかる)のときに、実例を作ることができません。非同期JS関数をラップしてOCamlで使用できますか?
非同期JS関数JSfun
ラップしたいのは以下の通りです。変数x
は2秒後に"here"
に設定され、これが返す値です。
function JSfun() {
var x = "before";
return new Promise(function(resolve, reject) {
setTimeout(function() {
append("inside setTimeout");
x = "here";
resolve(x);
}, 2000);
})
}
我々は成功したJSでJSfun
を呼び出し、予想通り"runJS here"
を得ることができます:
function runJS() {
JSfun().then(function(res) {
append("runJS " + res)
})
}
しかし、OCamlのことで、このチェーンを模倣することは困難です。 OCamlの中JSfun
をラップするために、我々が使用する必要がありますようだ:
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"
が表示されます。これは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")
);
誰にも解決策、アイデア、または回避策がありますか?