js_of_ocamlを使用して JS 関数をラップし、OCaml 内で呼び出すことができます。JS 関数が非同期の場合 (つまり、Promise が含まれていて時間がかかる場合) は、動作する例を作成できません。
JSfun
ラップしたい非同期JS関数は以下の通りです。変数x
は 2 秒後に設定され"here"
、これが私が返したい値です。
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")
);
それで、誰かが解決策、アイデア、または回避策を持っていますか?