在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));
基于问题中链接的文章,以及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 友情提示:本文直接从项目拿来供大家思路参考,验证提示那块大家可根据自己情况做更改。