dart js-interop与js.context的FunctionProxy回调关系

时间:2013-06-01 10:38:53

标签: callback dart

我有一个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中,以便在async"然后"执行它时可以使用它。方法。这行代码非常重要:

js.context.completionCallback = completionCallback;

如果没有这样做,则不保留completeCallback,因此在异步操作完成时无法调用。

我没有看到这样的例子,我不确定我是否真的这样做过。

提出了问题:

  1. 我如何取消关联" completeCallback"我打电话给js.context后呢?它是否永远与js.context相关联?
  2. 似乎将使用名称" completionCallback"如果多个异步操作同时进行,则在js.context中。这让我感到很常见。 js-interop有办法解决这个问题,还是我的工作是管理它?

1 个答案:

答案 0 :(得分: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")

完成此操作