从webView到JavaScript的回调:在本机代码和html之间共享数据

eDetailing(以及其他使用html5显示内容的应用程序)是一个非常普遍的技术问题,您需要在本机iOS(或Android,Windows)代码和html演示文稿之间共享数据。 而且代码可以而且确实会变得凌乱。

当您尝试在UIWebView和JavaScript库之间共享数据时,最终将得到类似的结果。

这样做的问题很明显:您定义了业务逻辑,然后调用iOS方法,应用程序有时会调用其他方法作为回调。 您最终将状态存储在全球范围内,并试图猜测当前您在过程中的确切位置。

幸运的是,最近在JavaScript中出现了一些警告,这些问题都消失了:

  • 承诺
  • 可观察的
  • 发电机功能

我们的目标是消除工作流中的发送方和回调之间的中断,并能够专注于业务逻辑,而不必担心在何处以及如何接收数据: 我只希望在调用本机函数时返回Promise

接回电话

首先,我们需要解决中断问题并在不离开发送方的情况下捕获回调。 为此,我们可以使用Observer模式 ,即ReactiveX。 我们观察何时调用回调:

回报承诺

现在,我们可以将所有这些内容简单地包装在Promise中,并在订阅者收到数据时对其进行解析 。 我还添加了一个超时,因此如果iOS代码出错,该代码将不会挂起。 另外,我们使用Bluebird,因为它本地Promise快得多。

清洁业务逻辑代码

现在回到业务逻辑。 多亏了Promise, 我不必离开业务逻辑功能的范围 。 使用co(或简单的生成器函数)将有助于使代码更加清晰。

而且由于要调用的函数集有限,因此可以为与本机iOS代码进行的所有交互创建一个漂亮的,抽象的和通用的库。

这里有一个完整的例子。