React native 在React本机代码库中,其中';s生成声明的“s”的代码;单一JSON消息";?

React native 在React本机代码库中,其中';s生成声明的“s”的代码;单一JSON消息";?,react-native,React Native,在一份声明中,Facebook工程师声称: React-Native被设计为返回一条JSON消息,其中列出要执行的突变,如[[“createView”,attrs],“manageChildren”,…]。我们将整个系统设计为永远不依赖于返回同步响应,并确保列表中的所有内容都可以完全序列化为JSON并返回 这个功能(构建JSON)的确切代码在*中的什么位置?或者引用的声明可能是一个谎言“简化” 我拼命地想找到它,但似乎在兜圈子;每当我发现一条最初看起来很有希望的轨迹时,它似乎永远无法将我带到一个

在一份声明中,Facebook工程师声称:

React-Native被设计为返回一条JSON消息,其中列出要执行的突变,如
[[“createView”,attrs],“manageChildren”,…]
。我们将整个系统设计为永远不依赖于返回同步响应,并确保列表中的所有内容都可以完全序列化为JSON并返回

这个功能(构建JSON)的确切代码在*中的什么位置?或者引用的声明可能是一个谎言“简化”

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

*请注意,我特别感兴趣的是Android代码库;理想情况下,,这是我写作时最新的版本

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

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

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

编辑编号1 基于此,我开始模糊地感觉到一个名为“
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)}
同一博客上的另一篇文章展示了如何。这可以回答我问题的最后可选部分的一半,关于如何在Expo中从JS订阅Java事件。(在Java中:
This.reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)。emit(“onSessionConnect”,params);
,在JS中:
DeviceEventEmitter.addListener('onSessionConnect',(事件)=>{console.log(event);};

另一个有趣的是,谷歌搜索“react native BatchedBridge”作为关键词

编辑2,暂定 构建JSON的地方可能是,尽管我不是很确定:

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


根据问题中链接的文章,以及从2015年开始,经过一天的深入研究,我相信这确实是
BatchedBridge
,也称为
MessageQueue
,它是Java/Swift和JS之间的呼叫总线

如果我理解正确的话,JS->Java调用是用完成的,定义为:

  enqueueNativeCall(
    moduleID: number,
    methodID: number,
    params: any[],
    onFail: ?Function,
    onSucc: ?Function,
  )
Java->JS调用是通过以下函数之一(在同一文件中)完成的:

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


编辑:
callFunctionReturnResultAndFlushedQueue
似乎返回JS函数的结果,因此它似乎必须是非异步的(阻塞)但是,在搜索“原生的RePO”的代码< MyCaleActualRealFrutsReultRefs>代码> > C++ > CalpFultRealReultRefsFulsHeaveQue/<代码>,它们中没有一个是从任何地方调用的。在C++中,您永远不能确定为100%,但现在我将交叉我的手指,假设它可以被安全地忽略。或者。我相信,您在JSCExecutor中引用的这行代码是序列化为JSON的。可能是我记错了,从JS返回的结果永远不会变成JSON(与从native返回的命令相反,后者肯定会)但它在某一点上做到了,而且正如你所注意到的,我们没有放松任何限制。我们会的。@SophieAlpert Woohoo,很高兴你插嘴,谢谢你的确认!:D
  enqueueNativeCall(
    moduleID: number,
    methodID: number,
    params: any[],
    onFail: ?Function,
    onSucc: ?Function,
  )
callFunctionReturnFlushedQueue(module: string, method: string, args: any[])
callFunctionReturnResultAndFlushedQueue(module: string, method: string, args: any[])
invokeCallbackAndReturnFlushedQueue(cbID: number, args: any[])