如何在iOS共享扩展中处理Javascript的异步完成?

Gre*_*reg 5 javascript ios ios-extensions

我正在制作一个可在网页上运行的简单iOS共享扩展程序.它与Pinterest没有什么不同,因为它从页面中获取某些信息.但它与Pinterest的不同之处在于,用于执行抓取的JS有时会自定义为网页域.

所以在ExtensionPreprocessingJS run()函数中,我执行以下操作来加载和执行自定义JS:

var Action = function() {};

Action.prototype = {

  run: function(arguments) {
    var e = document.createElement('script');
    e.setAttribute('type','application/javascript');
    e.setAttribute('id','my-unique-id');
    e.setAttribute('src','//mydomain.com/bookmarklet?d='+document.domain);
    document.body.appendChild(e);

    <some code to extract results and generate JSON>

    arguments.completionFunction({ <my JSON here> });
  }
};

var ExtensionPreprocessingJS = new Action
Run Code Online (Sandbox Code Playgroud)

我的bookmarklet端点提供了一些JS,它从页面中找到"pinning"的相关信息.

我的问题是,这是异步发生的,而不是在我使用运行方法结束时传回结果之前

arguments.completionFunction( <my JSON here> );
Run Code Online (Sandbox Code Playgroud)

我已经尝试在调用completionFunction()之前等待结果设置,但扩展似乎将其视为未完全调用的completionFunction().也就是说,共享扩展框架的设计似乎不适应异步JS.它假设在run()函数返回后,JS的结果可用.

我是否误解了共享扩展设计,或者我是否需要寻找不同的方法来实现这一目标?我注意到Instapaper创建了一个没有原生UI的共享扩展,我想知道这是否是他们这样做的原因.