当前位置: 首页 > 知识库问答 >
问题:

在React本机代码库中,生成声称的“单个JSON消息”的代码在哪里?

史洛城
2023-03-14

在2018年的一篇帖子中,Facebook工程师声称:

React Native旨在返回一条列出要执行的突变的JSON消息,例如[["createView", attrs],["总管儿童",...]]。我们将整个系统设计为永远不依赖于返回同步响应,并确保该列表中的所有内容都可以完全序列化为JSON并返回。

在React原生代码库中,负责这个特性(构建JSON)的确切代码在哪里?或者所引用的声明可能是一个谎言吗?

我拼命地想找到它,但似乎在兜圈子;每当我找到一条最初看起来很有希望的轨道时,它似乎永远无法将我带到一个会生成此类JSON的地方:(

*请注意,我特别感兴趣的Android代码库;理想情况下,RN v0.55,编写时的最新版本。

如果可能的话,我也对互补的“反向”代码感兴趣。我的意思是,我假设“本机”(Android的Java)代码也必须在某个时候向JS发送一些“事件”信号,我假设它们也是JSON。那么,这段代码在哪里?(我对接收和反序列化JSON的JS代码感兴趣。)

(此外,如果这些“低级”功能(发送和接收JSON)可以在基于Expo的应用程序中从JS以原始形式访问,我将非常感激;但这在回答中是百分之百可选的,因为我有理由相信,一旦我知道上述主要问题的答案,我就能自己找到答案。)

注:为了充分披露,我也在HN上交叉发布了这个问题,但截至写作时还没有答案。当HN上的讨论线程过时时,我计划从这里删除此注释

根据SO提出的“相关”问题,我开始有一种模糊的感觉,一个名为“BatchedBridge”的概念/关键字可能非常接近我正在寻找的东西。我的直觉似乎告诉我,这可能是朝着正确方向迈出的第一步。我发现了一篇博客文章,描述了如何观察通过BatchedBridge双向传输的消息,据报道,这会导致如下日志:

{type: 1, module: "WebSocketModule", method: "addListener", args: Array(1)}
{type: 1, module: "WebSocketModule", method: "connect", args: Array(4)}
{type: 0, module: "RCTDeviceEventEmitter", method: "emit", args: Array(2)}
{type: 1, module: "Timing", method: "createTimer", args: Array(4)}

同一博客上的另一篇文章展示了如何通过这个“桥”将事件从Java发送到JS,并在JS中聆听它们。这可以回答我问题的最后一个可选部分的一半,关于如何在Expo中订阅JS的Java活动。(在Java中:this.reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)。emit(“onSessionConnect”,参数,在JS中:DeviceEventEmitter。addListener('onSessionConnect',(事件)=

另一篇关于RN内部结构的有趣文章,来自以“反应原生BatchedBridge”为关键字的谷歌搜索。

JSON的构建位置可能是下面的第556行,尽管我不太确定:

550 void JSCExecutor::callNativeModules(Value&& value) {
...
556   auto calls = value.toJSONString();
557   m_delegate->callNativeModules(*this, folly::parseJson(calls), true);

例如,从下面的l.642中调用:

624 void JSCExecutor::invokeCallback(
625     const double callbackId,
626     const folly::dynamic& arguments) {
...
628   auto result = [&] {
...
634       return m_invokeCallbackAndReturnFlushedQueueJS->callAsFunction(
635           {Value::makeNumber(m_context, callbackId),
636            Value::fromDynamic(m_context, std::move(arguments))});
...
642   callNativeModules(std::move(result));

共有1个答案

卢德惠
2023-03-14

基于问题中链接的文章,以及2015年的一些视频,经过一天的深入研究,我相信这确实是批处理桥(BatchedBridge),即消息队列(MessageQueue),它是Java/Swift和JS之间的呼叫总线。

如果我理解正确,一个JS-

  enqueueNativeCall(
    moduleID: number,
    methodID: number,
    params: any[],
    onFail: ?Function,
    onSucc: ?Function,
  )

而Java-

callFunctionReturnFlushedQueue(module: string, method: string, args: any[])
callFunctionReturnResultAndFlushedQueue(module: string, method: string, args: any[])
invokeCallbackAndReturnFlushedQueue(cbID: number, args: any[])

这实际上仍然没有回答关于“JSON在哪里”的问题,但事实上,我更感兴趣的是找到总线并验证流经总线的是否是JSON。虽然我现在甚至不确定它最终是否会成为实际的JSON字符串,但我相信它至少是“意识形态上的”JSON。不兼容JSON的对象似乎不允许出现在IIUC上,我认为“函数指针/回调”被转换为函数名,因此可以从Java异步调用。我相信函数结果会被忽略(即假设所有JS函数都具有返回类型)。

编辑:callFunctionReturnResultAndFlushedQueue似乎返回JS函数的结果,因此它似乎必须是非异步的(阻塞)。但是在react本机repo中搜索m_callFunctionReturnResultAndFlushedQueueJS和callFunctionReturnResultAndFlushedQueueJS后,似乎没有从任何地方调用它们。在C语言中,你永远不可能百分之百确定,但现在我要祈祷并假设它可以被安全地忽略。

 类似资料:
  • 本文向大家介绍C# 生成随机数的代码,包括了C# 生成随机数的代码的使用技巧和注意事项,需要的朋友参考一下 以上就是本文的全部内容了,希望大家能够喜欢,能够对大家学习C#有所帮助。

  • 我正在根据参考指南学习使用Map结构。日食验证是 面向Web开发人员的Eclipse Java EE IDE。版本:开普勒服务版本2 pom。xml如下所示,与参考指南相同 它表示在构建项目时将生成实现代码。但是,它似乎不会在目标/生成的源文件夹下生成

  • 问题内容: 诸如Rails和Django之类的Web框架内置了对“子弹”的支持,“子弹”用于生成可读且对SEO友好的URL: Rails中的子弹 团状串典型地只包含的字符,并且可因此在不URL转义(认为“富%20巴”)编写的。 我在寻找一个Java蛞蝓函数给出任何有效的Unicode字符串将返回蛞蝓表示(,和)。 一个普通的子弹函数可能类似于: 但是,此实现无法处理国际化和重音符号(> )。解决此

  • 我正在尝试使用 https://github.com/swagger-api/swagger-codegen 生成 nodejs 客户端 sdk 这是我使用的命令 但是对于我需要生成的实际sdk,swagger规范被拆分为两个不同的json文件,我想为两者创建一个sdk。我如何使用Swagger-codecen做到这一点,同时使用多个swagger json?

  • 本文向大家介绍JavaScript 随机验证码的生成实例代码,包括了JavaScript 随机验证码的生成实例代码的使用技巧和注意事项,需要的朋友参考一下 随机验证码的生成 1: 主体部分 接下来时如何放入到验证框里面了 <input type="text"  id="checkCode" class="unchanged" style="width: 80px"  readonly/>    接

  • 本文向大家介绍vue生成随机验证码的示例代码,包括了vue生成随机验证码的示例代码的使用技巧和注意事项,需要的朋友参考一下 本文介绍了vue生成随机验证码的示例代码,分享给大家,具体如下: 样式自调,最终效果如图: 实现效果: 点击右边input框会自动切换,如果输入的值与字不同,则清空换一串随机数 HTML JS 友情提示:本文直接从项目拿来供大家思路参考,验证提示那块大家可根据自己情况做更改。