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);
})
}
JSfunJS を正常に呼び出して"runJS here"、期待どおりに取得できました。
function runJS() {
JSfun().then(function(res) {
append("runJS " + res)
})
}
しかし、OCaml でこの連鎖を真似するのは困難です。JSfunOCaml でラップするには、以下を使用する必要があるようです:
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")
);
それで、誰かが解決策、アイデア、または回避策を持っていますか?