0

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")
    );

それで、誰かが解決策、アイデア、または回避策を持っていますか?

4

1 に答える 1