jsonrpc.js -- 原生js实现 JSON-RPC 协议
很早以前就涉及到多端远程调用 api的设计,那时候自己设计了个消息传递回调过程。最近了解了JSON-RPC协议,更正规,就可以自己实现下。逻辑也不复杂,没有限制底层消息传递的方式,可以应用到更多的场景。在实现中,没有区分服务器端和客户端的概念,获得不同的消息体,进行不同的处理,更方便的进行双向通信。
github地址: https://github.com/legu2009/jsonrpc
jsonrpc
JSON-RPC 是一个无状态的轻量的远程调用协议. http://www.jsonrpc.org/specification.
jsonrpc.js 实现了 JSON-RPC 协议,没有实现消息传递的过程。实际使用的时候需要自己根据消息传递的方式扩展,也是该js应用的场景更广泛,不局限于底层消息传递方式。
环境
jsonrpc.js 只要是能够运行js的环境都可以。
不支持批量消息
处理批量消息的情况,有些是同步的,有些是异步的可能需要等待很长的时间,如果等所有批量的消息都有返回结构了,才发送结果消息,感觉存在的浪费
API
jsonRpc.addCommand(name,func,opt) Function
作为服务端,注册可以被远程端调用的方法
Arguments
- name(String): 方法的名字
- func(Function): 对应的方法
- opt(Object):
{
sync: false,//默认情况,函数返回不是Promise且为undefind时不调用回调
always: false,//默认情况,函数回调一次就不在调用回调,设置true可以一直回调,但是需要使用JsonRpc.running缓存回调方法,进行调用
}
jsonRpc.removeCommand(name) Function
作为服务端,移除远程端调用的方法
Arguments
- name(String): 方法的名字
jsonRpc.exec([extend],name,[params],[func]) Function
作为客户端,发起远程调用,调用远端name的方法,参数为params(JSON-RPC,协议,支持Arrary和Object),获得返回的运行结果的时候,运行对应的func方法
Arguments
- extend:
{
always: true,//函数回调不会清除引用,用于响应多server消息响应
...otherProps: //Object.assign 扩展obj
} - name(String): 远端方法的名字
- params(Arrary or Object): 运行远端方法时候的参数(形式同JSON-RPC协议 的 params)
- func(Function(reresult messages)): 返回的运行结果的时候,运行对应的方法,没有该参数,为通知方式发送消息
jsonRpc._send Function
需要扩展,实现底层消息传递
Arguments
- obj(Object): 需要发送到远端的消息对象
- mess(Object): mess是undefined时,本地可以理解为客户端,运行了jsonRpc.exec方法; mess存在的时候,本地可以理解为服务端,运行了对应的方法,mess为请求的数据
jsonRpc._onMessage Function
当有消息接收的时候主动调用,通过jsonRpc处理逻辑
jsonRpc.onCall(mess) Function
作为服务端,注册的方法执行前调用,返回false不执行方法
jsonRpc.onResult(mess) Function
作为客户端,接收到返回消息,执行回调之前,返回false不执行回调
EXAMPLE
没有实际项目应用,只是觉得需要支持
test.html
基本消息传递的例子
sync.html
同步函数情况下,对返回值undefind的特殊处理
send.html
通过_call,从消息体本身的设计,限制哪个服务端执行逻辑
result.html
通过_guid,从消息体本身的设计,限制客户端对回调消息的执行,提高消息验证
always1.html
作为服务器端,回调消息 分多次返回客户端执行回调方法
always2.html
作为客户端,对一次发送多个服务器端消息,所有响应都执行回调方法,默认回调只执行第一次
jsonrpc.js -- 原生js实现 JSON-RPC 协议的更多相关文章
- js 原生JS实现轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS 原生JS 判断滚动条滑动到底部(兼容苹果safari)
ListenerScoller () { var pageIndex = 1; var startX, startY; document.addEventListener('touchstart',f ...
- JS 原生JS 判断滚动条滑动到底部
window.addEventListener("scroll", function(event) { var scrollTop = document.documentEleme ...
- 放弃jQuery,使用原生js吧!
转自:http://itakeo.com/blog/2015/07/28/nojq/ 随着IE6.7.8的逐渐淘汰,HTML5的兴起,以及侧重点放在了移动端,jQuery可能变的不在那么重要,原生一样 ...
- koa 基础(十七)原生 JS 中的类、静态方法、继承
1.app.js /** * 原生 JS 中的类.静态方法.继承 * es5中的类和静态方法 */ function Person(name, age) { // 构造函数里面的方法和属性 this. ...
- 原生js实现ajax与jquery的ajax库,及json
这是一篇笔记博客, Ajax: 和服务器进行数据交换(异步) 用js实现复杂的原理:用于发送请求的对象在不同的浏览器中是不同的 同源策略:ajax发送请求的url地址与服务器地址必须是同一域名,协议, ...
- 原生js封装ajax:传json,str,excel文件上传表单提交
由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(u ...
- 初探原生js根据json数据动态创建table
初探原生js根据json数据动态创建table 小生以实习生的职位进入了一家非纯软件的公司做asp.net开发,大半个月下来发现公司里居然没有前端工程师,这令我很诧异,跟着公司做项目,发现前端后台没有 ...
- JQuery和原生JS跨域加载JSON数据或HTML。
前提:有时候需要在网页上,加载另一个网站上的数据.或者加载另一个网站上的一个页面.Js的Ajax请求不具备跨域功能,可以使用JQuery来实现. 网页端JS代码: $(function () { $. ...
随机推荐
- 触发器的SQL语法
create trigger triggerName after/before insert/update/delete on 表名 for each row #这句话在mysql是固定的 begin ...
- vue学习记录
vue中常用的指令 v-model 双向数据绑定,一般用于表单元素 v-for 对数组或对象进行循环操作,使用的是v-for <!-- 普通循环 --><li v-for=" ...
- Pythagorean Triples(Codeforces Round #368 (Div. 2) + 构建直角三角形)
题目链接: https://codeforces.com/contest/707/problem/C 题目: 题意: 告诉你直角三角形的一条边,要你输出另外两条边. 思路: 我们容易发现除2外的所有素 ...
- 弗罗贝尼乌斯範数(Frobenius norm)
弗罗贝尼乌斯範数 对 p = 2,这称为弗罗贝尼乌斯範数(Frobenius norm)或希尔伯特-施密特範数( Hilbert–Schmidt norm),不过后面这个术语通常只用于希尔伯特空间.这 ...
- UNIX环境高级编程 第4章 文件和目录
第三章说明了关于文件I/O的基本函数,主要是针对普通regular类型文件.本章描述文件的属性,除了regular文件还有其他类型的文件. 函数stat.fstat.fstatat和lstat sta ...
- CSS 特殊性、继承与层叠
一.特殊性规则 选择器的特殊性由选择器本身的组件确定:特殊性由四个部分组成,其初始值为0,0,0,0. 1. 对于选择器中的每一个id,记0,1,0,0: 2. 对于选择器中的每一个类.伪 ...
- Spring4笔记10--SSH整合1--Spring与Hibernate整合
SSH 框架整合技术: 1. Spring与Hibernate整合(对比Spring与JDBC模板): Service业务层代码和测试类都不变,添加实体类的映射配置文件: <?xml versi ...
- 【算法学习】老算法,新姿势,STL——Heap
“堆”是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值. 这都是老套路了,具体的内部实现我也就不谈了. 我一般来说,都是用queue库中的priority_queu ...
- 3 - django-template模板基本使用
目录 1 Template 1.1 模板的基础使用 1.1.1 变量 1.1.2 注释标签 1.1.3 深度查询 1.1.4 内置变量过滤器filter 1.1.5 自定义过滤器之filter 1.1 ...
- Sort Colors I & II
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...