1

Dart js-interop コールバックがあり、JavaScript コールバックを引数として受け取ります。Dart コールバックの実装は次のようになります。

void callBackToDartCode(String query, js.FunctionProxy completionCallback) {
  js.context.completionCallback = completionCallback;
  doSomethingAscyn(query).then(
    (result) {
       // hand the query result back to the javascript code
       js.context.completionCallback(js.map(result));
  });

これは機能します。これを機能させるための鍵は、FunctionProxy を js.context に保存して、非同期の「then」メソッドで実行するときに使用できるようにすることです。このコード行は重要です。

js.context.completionCallback = completionCallback;

そうしないと、completeCallback が保持されないため、非同期操作が完了したときに呼び出すことができません。

私はこのような例を見たことがなく、本当にこれを適切に行ったかどうか確信が持てません。

それは疑問を提起します:

  1. 「completeCallback」を呼び出した後、js.context から関連付けを解除するにはどうすればよいですか? それは永遠に js.context に関連付けられたままですか?
  2. 複数の非同期操作が同時に進行中の場合、js.context 内で「completionCallback」という名前の使用が競合するようです。それはよくある問題だと思います。js-interop にはそれに対処する方法がありますか、それともそれを管理するのが私の仕事ですか?
4

1 に答える 1

1

js-interopを使用すると、メモリ リークを防ぐためにすべてのプロキシがスコープされます。これはProxy、関連付けられたスコープの最後で JS オブジェクト参照が失われることを意味します。scoped((){})関数が明示的に使用されていない場合、最初に相互運用操作が行われたときに遅延スコープが初期化され、現在のイベント ループの最後でスコープが自動的に閉じられます。Proxyを関連付けられたスコープよりも長く存続させたい場合は、それを保持する必要があります。これは で行うことができますjs.retain(proxy)。プロキシが不要になったら、 で解放できますjs.release(proxy)

したがって、コードは次のようになります。

void callBackToDartCode(String query, js.FunctionProxy completionCallback) {
  js.retain(completionCallback);
  doSomethingAscyn(query).then(
    (result) {
       // hand the query result back to the javascript code
       completionCallback(js.map(result));
       // completionCallback is no longer used
       js.release(completionCallback);
  });
}

js.context から「completeCallback」の関連付けを解除することについての質問についてjs.deleteProperty(js.context, "completeCallback")

于 2013-06-01T19:49:21.400 に答える