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 () { $. ...
随机推荐
- python的dict()字典数据类型的方法详解以及案例使用
一.之前的回顾 # int 数字 # str 字符串 # list 列表 # tuple 元组 # dict 字典 字典中最重要的方法 keys() values() items() get upd ...
- 获取异常信息e.printStackTrace()的内容
获取异常信息e.printStackTrace()的内容 最近做项目的时候需要记录操作的日志,但是记录异常信息的是发现使用e.getMessage()根本无法满足需要,并且e.getMessage() ...
- python---基础知识回顾(十)进程和线程(协程gevent:线程在I/O请求上的优化)
优点:使用gevent协程,可以更好的利用线程资源.(基于线程实现) 需求:使用一个线程,去请求多个网站的资源(注意,请求上会有延时)<实际上是去请求了大量的网站信息,我们使用了多线程,只不过每 ...
- codevs 1500 后缀排序
codevs 1500 后缀排序 http://codevs.cn/problem/1500/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 天凯是MI ...
- Spring3.2 Contorller单元测试参数问题: java.lang.NoSuchMethodException
使用3.2做单元测试的时候发现这个问题,因为之前都是用3.0中的配置适配器使用AnnotationMethodHandlerAdapter,到3.2中升级为RequestMappingHandlerA ...
- table表格frame属性
定义和用法 frame 属性规定外侧边框的哪个部分是可见的. 从实用角度出发,最好不要规定 frame,而是使用 CSS 来添加边框样式. 浏览器支持 除了 Internet Explorer,其他浏 ...
- 微服务深入浅出(10)-- Docker
概念 1.Docker引擎 一个运行在服务器上的后台进程 2.Docker客户端 分为两种:CLI和RestAPI,与Docker引擎交互 3.Docker镜像 类似于我们使用的光盘,将程序打包到Do ...
- 内核工具 – Sparse 简介【转】
转自:http://www.cnblogs.com/wang_yb/p/3575039.html Sparse是内核代码静态分析工具, 能够帮助我们找出代码中的隐患. 主要内容: Sparse 介绍 ...
- aarch64_m2
mingw32-leptonica-1.74.4-1.fc26.noarch.rpm 2017-06-12 17:20 1.0M fedora Mirroring Project mingw32-le ...
- Python的日志记录-logging模块的使用
一.日志 1.1什么是日志 日志是跟踪软件运行时所发生的事件的一种方法,软件开发者在代码中调用日志函数,表明发生了特定的事件,事件由描述性消息描述,同时还包含事件的重要性,重要性也称为级别或严重性. ...