CN104423932A - Javascript中调用二进制组件的方法 - Google Patents
Javascript中调用二进制组件的方法 Download PDFInfo
- Publication number
- CN104423932A CN104423932A CN201310367174.7A CN201310367174A CN104423932A CN 104423932 A CN104423932 A CN 104423932A CN 201310367174 A CN201310367174 A CN 201310367174A CN 104423932 A CN104423932 A CN 104423932A
- Authority
- CN
- China
- Prior art keywords
- javascript
- binary element
- call
- character string
- callback
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供一种Javascript中调用二进制组件的方法,该方法包括:Javascript引擎获取Javascript语句中的字符串并判定是否为Javascript语言节点;若不是Javascript语言节点,则Javascript引擎的异常拦截器拦截并获取该字符串;从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件;创建该字符串对应的二进制组件对象并封装为Javascript对象。该方法实现在Javascript脚本解析执行过程中根据需要灵活加载二进制组件。
Description
技术领域
本发明涉及Javascript中调用自定义组件的技术,尤其涉及一种Javascript中调用二进制组件的方法。
背景技术
目前,使用浏览器作为本地应用的平台已经有了广泛的实际应用,HTML/CSS处理页面显示和美化,Javascript脚本处理页面逻辑。但是,Javascript作为脚本语言存在一定的先天局限性,出于安全性方面的考量,Javascript脚本不具备访问本地资源的能力,对于网络访问也受到同源策略(Same Origin Policy)的严格限制,所以,基于浏览器的应用在获取外部资源和外部程序的支持时,需要对浏览器进行额外的扩展,目前多数浏览器通过本地插件式扩展机制以扩展Javascript脚本的功能。
实现Javascript脚本调用组件的可行策略是,在Javascript引擎初始化时,增加一个组件的注册表,将组件的所有信息全部注册到Javascript运行环境的全局变量中。但是,将组件所有信息在Javascript初始化时全部注册的话,导致Javascript引擎初始化过程耗时且内存占用量过大。
发明内容
鉴于上述内容,有必要提出一种Javascript中调用二进制组件的方法,该方法可以实现在Javascript脚本运行时灵活调用二进制组件以扩展Javascript脚本的功能。
所述Javascript中调用二进制组件的方法,包括步骤:Javascript引擎获取Javascript语句中的字符串并判定是否为Javascript语言节点;若不是Javascript语言节点,Javascript引擎的异常拦截器拦截并获取该字符串;从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件;创建该字符串对应的二进制组件对象并封装为Javascript对象。
相比于现有技术,本发明所述Javascript中调用二进制组件的方法,通过修改Javascript引擎的异常处理机制的方式,使得在Javascript脚本运行时活加载二进制组件。另外,当调用的二进制组件为支持同步和异步回调的CAR组件,在Javascript脚本中调用该CAR组件对象的方法而触发回调事件时,能够同步或是异步回调该回调事件的回调函数。
附图说明
图1是通过修改Javascript引擎的异常处理机制实现Javascript中调用CAR组件的方法流程图。
图2是一个CAR组件示例FooBar组件的的程序代码。
图3是触发回调事件执行异步回调的示意图。
具体实施方式
本较佳实施例中以CAR组件作为二进制组件的示例进行说明,本领域的技术人员可以将该方法应用到其他二进制组件中,以实现在Javascript中调用二进制组件。
所述CAR组件(Component Assembly Runtime)是上海科泰世纪科技有限公司开发的一种二进制组件,该CAR组件技术是在Elastos平台上(Elastos,一种组件化操作系统)面向组件的编程模型,规定了组件之间相互调用的标准,并且二进制组件能够自我描述。
所述CAR组件采用C++编写,携带有元数据(metadata),通过该元数据CAR组件可以实现反射机制。该元数据是描述数据的数据,对数据的抽象,主要包括了数据的类型信息,例如CAR组件的模块信息、接口信息、类信息等数据,且元数据与CAR组件的可执行代码存储在一起,是CAR组件的二进制描述。
所述CAR组件的反射机制,提供统一调用CAR组件内封装的所有接口的Invoke方法,形如:Invoke(object_name,method_name,parameters)以实现对CAR组件的统一封装。例如,在Javascript或是C语言的环境中调用某一CAR组件对象foo的方法Bar(例如:foo.Bar()),则在执行时通过反射机制调用Invoke方法(例如:Invoke(foo,Bar,Null),实现了对CAR组件对象所有方法具体调用的封装。
以上是对CAR组件的简单描述,关于CAR组件的详细内容可参考CAR组件的使用说明手册等。
参阅图1所示,是通过修改Javascript引擎的异常处理机制实现Javascript中调用CAR组件的方法流程图。
步骤S01,Javascript引擎获取Javascript语句中的字符串。
Javascript是一种解释执行的语言,由浏览器的Javascript引擎解释执行。在Javascript中调用自定义组件时,一般是在Javascript引擎初始化时预先注册自定义组件,使得在调用过程中能够将自定义组件正确解析执行。而本较佳实施例中,对Javascript引擎的异常处理机制进行扩展,以实现在Javascript脚本解析执行时根据需要灵活加载CAR组件。
步骤S02,判定上述字符串是否为Javascript的标准语言节点,若是则进入步骤S03,否则进入步骤S04。
例如,Javascript脚本中var foo=new CFoo(),CFoo()为CAR组件中的一个类,CFoo()在当前Javascript脚本的上下文(Context)中并未定义,Javascript引擎无法执行new CFoo()以创建foo对象,此时,Javascript引擎因该CFoo()不是Javascript标准语言节点,无法识别而抛出异常。
步骤S03,Javascript引擎解释并执行该Javascript语句。
步骤S04,Javascript引擎的异常拦截器进行拦截并获取该异常(非Javascript的标准语言节点)的字符串。
接续上述举例,当Javascript引擎抛出异常节点CFoo(),异常拦截器拦截并获取异常的字符串或语言节点。
步骤S05,从CAR组件加载路径中查询是否存在该字符串对应的CAR组件,若存在,则进入步骤S07,否则进入步骤S06。
步骤S06,Javascript引擎异常报错处理。
当不存在该字符串对应的CAR组件,该节点既不是Javascript的语言节点,也不是CAR组件,则Javascript引擎无法识别该字符串,无法解释执行,则进行报错处理。
步骤S07,Javascript引擎创建该字符串对应的CAR组件对象。
步骤S08,利用Javascript引擎的API(Application ProgrammingInterface,应用程序接口)将创建的CAR组件对象封装为Javascript对象返回到Javascript的运行环境中。
以上拦截Javascript引擎异常的方式实现Javascript中调用CAR组件,根据Javascript脚本中调用组件的情形灵活加载CAR组件。
在实际应用中,当浏览器为Mozilla组织提供的浏览器(例如:Firefox火狐浏览器)或Javascript引擎为Mozilla组织所提供的SpiderMonkey,还可以通过以XPCOM组件形式接入CAR组件,实现在Javascript脚本中调用CAR组件。
所述Mozilla组织(Mozilla,哥斯拉)是一个支持和领导开源的Mozilla项目而设立的非盈利组织。所述SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的Javascript脚本引擎,该引擎支持在Javascript脚本中调用XPCOM组件。所述XPCOM(Cross PlatformComponent Object Model,XPCOM),是Mozilla的跨平台组件对象模型,类似微软的COM(Component Object Model,组件对象模型)。
所述以XPCOM组件形式接入CAR组件,通过以下步骤实现:
a)在Javascript引擎中注册封装所有CAR组件的一个XPCOM组件,如注册一个名为elastos的XPCOM组件;
b)重写上述的XPCOM组件elastos创建对象的方法createInstance方法,例如,var foo=elastos.createInstance(“path/class_name:version”),创建elastos封装的某一个CAR组件的一个类对象foo,createInstance的参数为“CAR组件加载路径/类名:版本号”;
c)修改Javascript引擎中调用XPCOM组件对象的方法的Call方法,在调用组件对象的方法时增加一个判定,若调用方法的对象是elastos创建的对象时,则使用CAR组件内部自建的Invoke方法调用该组件对象的方法;若为其他标准XPCOM组件创建的对象时,则使用XPCOM组件的标准Call方法调用组件对象的方法。例如,上述CAR组件的类对象foo,在Javascript中执行foo.doWork(),doWork()为foo的一个方法,若foo为标准XPCOM组件创建的对象,则Javascript引擎通过调用Call方法来调用执行doWork()方法;若foo为elastos这个XPCOM组件创建的对象,则Javascript引擎通过调用CAR组件内部的Invoke方法来调用执行doWork()方法。
需要说明,上述XPCOM组件封装CAR组件的方式实现Javascript脚本中调用CAR组件,具有一定局限性,仅针对于Mozilla的浏览器。
需要指出的是,Javascript语法中对于回调的支持形式单一,仅支持同步回调及定时延迟回调,并没有支持异步回调。基于上述两种不同方式实现Javascript脚本中调用CAR组件的基础上(拦截Javascript引擎异常或XPCOM组件封装CAR组件),进一步在Javascript脚本中使用CAR组件的回调机制,实现在Javascript中对回调函数的同步和异步回调。
结合图2所示的CAR组件示例FooBar组件的程序代码,详细说明Javascript中调用CAR组件的同步和异步回调机制。
1)修改Javascript引擎的异常处理机制或是注册elastos的XPCOM组件,Javascript引擎初始化时创建CAR组件的回调执行线程。
2)在Javascript页面中创建CAR组件对象。
形如:
var foobar=new CFooBar();//拦截异常方式调用CAR组件
var foobar=elastos.createInstance(
“Com.Elastos.Components.Foobar.eco/CFooBar:1”);
//XPCOM形式调用CAR组件
如图2所示,FooBar组件中包括有一个名为CFooBar的类,该类实现了接口IFoo和IBar的Foo()方法和Bar()方法,其中,Foo()方法中的代码Callback::FooEvent()是指在Foo()方法被调用执行时会触发异步回调事件FooEvent,Bar()方法中的代码Delegate::FooErrand()是指在Bar()方法被调用执行时会触发同步回调事件FooErrand。
3)在Javascript代码中定义回调事件的回调函数。
形如:
4)关联注册回调事件和回调函数。
形如:
foobar.addCallback(FooEvent,FooEventHandler);
foobar.addCallback(FooErrand,FooErrandHandler);
5)Javascript脚本中调用CAR组件对象的方法而触发回调事件。
形如:
foobar.Foo();//Foo方法调用执行,触发异步回调事件FooEvent
foobar.Bar();//Bar方法调用执行,触发同步回调事件FooErrand
Javascript编程人员通过CAR组件的说明手册,可以明确知道CAR组件所包括的类、方法及方法调用时触发的回调事件,回调事件的属性是同步或是异步(delegate或callback)是由CAR组件的开发人员在开发时指定,可以为编程人员所获悉。
JavaScript代码中的foobar.Foo()和foobar.Bar()的调用会触发定义的回调事件,至于这个回调事件的属性是同步回调还是异步回调,取决于调用的CAR组件方法触发回调事件时所调用的是异步回调接口(Callback::FooEvent)还是同步回调接口(Delegate::FooErrand)。
6)触发回调事件,当该回调事件属性是同步时,若该回调事件关联的回调函数为Javascript函数则Javascript引擎主线程执行该回调函数,若关联的回调函数非Javascript函数(如C或C++的函数)则回调执行线程执行该回调函数;当该回调事件属性是异步时,如图3示,Javascript主线程发送该回调事件给回调执行线程,回调执行线程捕捉该回调事件,若该异步回调事件关联的回调函数为Javascript函数,则回调执行线程将该异步回调事件以及回调函数打包并回抛给Javascript引擎主线程,若关联的回调函数非Javascript函数,则回调执行线程执行该回调函数。
以FooEvent该异步回调事件为例,详细说明异步回调执行过程:如图2所示,CAR组件中Foo方法是调用异步回调接口Callback::FooEvent,则该回调事件FooEvent为异步事件;如图3所示Javascript引擎主线程执行foobar.Foo()的方法调用,该方法Foo()触发产生回调事件FooEvent;Javascript引擎主线程将该异步回调事件发送给回调执行线程;回调执行线程接收该回调事件并进行处理;若该回调事件的回调函数为C或C++语言编写,则回调执行线程执行该回调函数;若该回调事件的回调函数为Javascript语言编写,则回调执行线程将该回调事件和关联的回调函数打包并回抛给Javascript引擎主线程,Javascript引擎主线程的消息队列接收回抛的回调事件并依序处理该回调事件的回调函数。
需要说明的是,由于Javascript引擎限定所有Javascript代码必须由且仅由Javascript引擎主线程执行,该限定使得当触发异步回调事件时,虽Javascript引擎主线程将该回调事件抛到回调执行线程中,但是由于回调执行线程无法执行Javascript代码的回调函数,故只能将该回调事件重新回抛至Javascript引擎主线程。
最后需要指出的是,以上具体实施方式仅用于说明本发明的技术方案而非限制,本领域的普通技术人员应当理解,对本发明的技术方案进行等同替换或是修改,都不应脱离本发明技术方案的精神范围。
Claims (7)
1.一种Javascript中调用二进制组件的方法,应用于Javascript引擎中,其特征在于,该方法包括以下步骤以Javascript引擎的异常拦截方式实现调用二进制组件:
判定步骤:Javascript引擎获取Javascript语句中的字符串并判定该字符串是否为Javascript语言节点;
拦截步骤:若该字符串不是Javascript语言节点,Javascript引擎的异常拦截器拦截并获取该字符串;
检索步骤:从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件;
创建步骤:当二进制组件的加载路径中存在与该字符串对应的二进制组件时,创建该字符串对应的二进制组件对象并封装为Javascript对象。
2.如权利要求1所述的Javascript中调用二进制组件的方法,其特征在于,该方法还包括:当判定Javascript语句中的字符串为Javascript语言节点,Javascript引擎解释并执行该Javascript语句。
3.如权利要求1所述的Javascript中调用二进制组件的方法,其特征在于,该方法还包括:当二进制组件的加载路径中未查询到该字符串对应的二进制组件时,Javascript引擎进行异常报错处理。
4.如权利要求1所述的Javascript中调用二进制组件的方法,其特征在于,该方法还以XPCOM组件封装二进制组件的方式实现调用二进制组件,包括以下步骤:
注册步骤:注册一个封装所有二进制组件的XPCOM组件;
重写步骤:重写该XPCOM组件创建对象的方法;
判定步骤:当Javascript引擎调用XPCOM组件对象的方法时,若调用方法的对象为上述XPCOM组件封装的二进制组件创建的对象,则使用二进制组件内部自建的方法调用该对象的方法,若调用方法的对象为标准XPCOM组件创建的对象,则调用XPCOM的标准Call方法调用该对象的方法。
5.如权利要求1或4所述的Javascript中调用二进制组件的方法,其特征在于,当调用的二进制组件为CAR组件,在Javascript脚本中使用CAR组件的回调机制,实现在Javascript中回调函数的同步和异步回调。
6.如权利要求5所述的Javascript中调用二进制组件的方法,其特征在于,该方法还包括:当调用的二进制组件为CAR组件,Javascript引擎在初始化时,创建一个回调执行线程执行回调事件的回调函数。
7.如权利要求6所述的Javascript中调用二进制组件的方法,其特征在于,当调用CAR组件对象的方法而触发回调事件时,该回调事件的回调函数的执行过程为:
当该回调事件属性为同步时,若同步回调事件关联的回调函数为Javascript函数则由Javascript引擎主线程直接执行该回调函数,若同步回调事件关联的回调函数非Javascript函数则由回调执行线程执行该回调函数;
当该回调事件属性是异步时,Javascript主线程发送该回调事件给回调执行线程,回调执行线程捕捉该异步回调事件,若该异步回调事件关联的回调函数为Javascript函数,则回调执行线程将该异步回调事件和回调函数打包并回抛给Javascript引擎主线程,若该异步回调事件关联的回调函数非Javascript函数,则由回调执行线程执行该回调函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310367174.7A CN104423932B (zh) | 2013-08-21 | 2013-08-21 | Javascript中调用二进制组件的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310367174.7A CN104423932B (zh) | 2013-08-21 | 2013-08-21 | Javascript中调用二进制组件的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104423932A true CN104423932A (zh) | 2015-03-18 |
CN104423932B CN104423932B (zh) | 2018-03-16 |
Family
ID=52973029
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310367174.7A Expired - Fee Related CN104423932B (zh) | 2013-08-21 | 2013-08-21 | Javascript中调用二进制组件的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104423932B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104881305A (zh) * | 2015-05-13 | 2015-09-02 | 福建天晴数码有限公司 | 加载Fragment的方法及终端 |
CN105005508A (zh) * | 2015-07-02 | 2015-10-28 | 国云科技股份有限公司 | 一种优秀的异常处理方法 |
CN107632885A (zh) * | 2017-09-26 | 2018-01-26 | 郑州云海信息技术有限公司 | 组件间的回调管理方法和装置 |
CN108733416A (zh) * | 2017-04-21 | 2018-11-02 | 北大方正集团有限公司 | 基于JavaScript的日期格式处理方法及系统 |
CN112631571A (zh) * | 2020-11-25 | 2021-04-09 | 浙江蓝卓工业互联网信息技术有限公司 | 一种web编辑器内组件的联动方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100262650A1 (en) * | 2008-10-08 | 2010-10-14 | Abhishek Chauhan | Systems and methods for connection management for asynchronous messaging over http |
CN102053994A (zh) * | 2009-11-10 | 2011-05-11 | 阿里巴巴集团控股有限公司 | 一种语言解析器和应用该解析器的解析方法 |
US20120023554A1 (en) * | 2010-07-21 | 2012-01-26 | Marco Murgia | Systems and methods for providing a smart group |
CN102375731A (zh) * | 2010-08-23 | 2012-03-14 | 融建信息技术(厦门)有限公司 | 一种免编码集成应用软件平台系统 |
CN102523136A (zh) * | 2011-12-22 | 2012-06-27 | 东南大学 | 一种无线传感器网络数据链路层协议测试方法及系统 |
-
2013
- 2013-08-21 CN CN201310367174.7A patent/CN104423932B/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100262650A1 (en) * | 2008-10-08 | 2010-10-14 | Abhishek Chauhan | Systems and methods for connection management for asynchronous messaging over http |
CN102053994A (zh) * | 2009-11-10 | 2011-05-11 | 阿里巴巴集团控股有限公司 | 一种语言解析器和应用该解析器的解析方法 |
US20120023554A1 (en) * | 2010-07-21 | 2012-01-26 | Marco Murgia | Systems and methods for providing a smart group |
CN102375731A (zh) * | 2010-08-23 | 2012-03-14 | 融建信息技术(厦门)有限公司 | 一种免编码集成应用软件平台系统 |
CN102523136A (zh) * | 2011-12-22 | 2012-06-27 | 东南大学 | 一种无线传感器网络数据链路层协议测试方法及系统 |
Non-Patent Citations (3)
Title |
---|
丁苍峰: "基于MVC架构的轻量级工作流引擎研究与设计", 《电子设计工程》 * |
张立杰 等: "跨平台的开发环境——Mozilla简介", 《计算机与数字工程》 * |
李德贤 等: "JSON-RPC 协议分析、扩展及其应用", 《中国科技论文在线》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104881305A (zh) * | 2015-05-13 | 2015-09-02 | 福建天晴数码有限公司 | 加载Fragment的方法及终端 |
CN104881305B (zh) * | 2015-05-13 | 2018-03-06 | 福建天晴数码有限公司 | 加载Fragment的方法及终端 |
CN105005508A (zh) * | 2015-07-02 | 2015-10-28 | 国云科技股份有限公司 | 一种优秀的异常处理方法 |
CN108733416A (zh) * | 2017-04-21 | 2018-11-02 | 北大方正集团有限公司 | 基于JavaScript的日期格式处理方法及系统 |
CN107632885A (zh) * | 2017-09-26 | 2018-01-26 | 郑州云海信息技术有限公司 | 组件间的回调管理方法和装置 |
CN112631571A (zh) * | 2020-11-25 | 2021-04-09 | 浙江蓝卓工业互联网信息技术有限公司 | 一种web编辑器内组件的联动方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN104423932B (zh) | 2018-03-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8108834B2 (en) | Defining and executing processes using declarative programming language constructs | |
CN104423932A (zh) | Javascript中调用二进制组件的方法 | |
CN109542506B (zh) | 一种可灵活配置接口和快速交付服务的系统 | |
CN106844153B (zh) | 应用程序运行监控方法、装置以及终端 | |
US20130086625A1 (en) | Enforcing security rules at runtime | |
US9182953B2 (en) | Hybrid dynamic code compiling device, method, and service system thereof | |
CN110806868B (zh) | 一种单页面搭建及加载方法 | |
CN104424002A (zh) | 一种基于插件机制的动态加载组件方法和系统 | |
CN104317591A (zh) | 一种基于OSGi的web界面框架系统及web业务处理方法 | |
US11113050B2 (en) | Application architecture generation | |
US10089084B2 (en) | System and method for reusing JavaScript code available in a SOA middleware environment from a process defined by a process execution language | |
CN108446105B (zh) | 一种轻量级API Server开发框架及开发方法 | |
US20090187927A1 (en) | Method for invoking UOML instructions | |
JP2011516987A (ja) | モバイル・デバイス・ソフトウェアの管理方法及び装置 | |
CN105743955A (zh) | 一种扩展JavaScript对象方法 | |
CN110888652A (zh) | 基于jenkins插件的多版本构建方法及终端 | |
CN104852939A (zh) | 一种部署能力接口的方法和系统 | |
CN111651169B (zh) | 基于web容器的区块链智能合约运行方法及系统 | |
US10268496B2 (en) | System and method for supporting object notation variables in a process defined by a process execution language for execution in a SOA middleware environment | |
CN114095347A (zh) | 网络业务自动化平台、冲突管理方法、设备及存储介质 | |
CN116107590A (zh) | 软件产品开发部署中兼容微服务和单体架构的实现方法及系统 | |
US8024746B2 (en) | Common handler framework | |
CN105260179A (zh) | 一种实现flex与servlet交互的方法 | |
CN110673890B (zh) | 插件调用方法、系统、介质及装置 | |
WO2022093666A1 (en) | Architectural design for universal software automation pipelines |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180316 Termination date: 20200821 |