很早以前就涉及到多端远程调用 api的设计,那时候自己设计了个消息传递回调过程。最近了解了JSON-RPC协议,更正规,就可以自己实现下。逻辑也不复杂,没有限制底层消息传递的方式,可以应用到更多的场景。在实现中,没有区分服务器端和客户端的概念,获得不同的消息体,进行不同的处理,更方便的进行双向通信。

github地址: https://github.com/legu2009/jsonrpc

博客园地址:http://www.cnblogs.com/legu/p/8119678.html

jsonrpc

JSON-RPC 是一个无状态的轻量的远程调用协议. http://www.jsonrpc.org/specification.

jsonrpc.js 实现了 JSON-RPC 协议,没有实现消息传递的过程。实际使用的时候需要自己根据消息传递的方式扩展,也是该js应用的场景更广泛,不局限于底层消息传递方式。

环境

jsonrpc.js 只要是能够运行js的环境都可以。

不支持批量消息

处理批量消息的情况,有些是同步的,有些是异步的可能需要等待很长的时间,如果等所有批量的消息都有返回结构了,才发送结果消息,感觉存在的浪费

API

JsonRpc Function
返回一个 jsonRpc 实例,实例之间共用自增长 id
 
  success Function
      fail Function
}
作为服务端,JsonRpc上的静态属性,只在作为服务器端函数运行的时候,指向了当前消息回调的方法,如果是异步处理,请一开始缓存running对象保证函数正确

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

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 协议的更多相关文章

  1. js 原生JS实现轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. JS 原生JS 判断滚动条滑动到底部(兼容苹果safari)

    ListenerScoller () { var pageIndex = 1; var startX, startY; document.addEventListener('touchstart',f ...

  3. JS 原生JS 判断滚动条滑动到底部

    window.addEventListener("scroll", function(event) { var scrollTop = document.documentEleme ...

  4. 放弃jQuery,使用原生js吧!

    转自:http://itakeo.com/blog/2015/07/28/nojq/ 随着IE6.7.8的逐渐淘汰,HTML5的兴起,以及侧重点放在了移动端,jQuery可能变的不在那么重要,原生一样 ...

  5. koa 基础(十七)原生 JS 中的类、静态方法、继承

    1.app.js /** * 原生 JS 中的类.静态方法.继承 * es5中的类和静态方法 */ function Person(name, age) { // 构造函数里面的方法和属性 this. ...

  6. 原生js实现ajax与jquery的ajax库,及json

    这是一篇笔记博客, Ajax: 和服务器进行数据交换(异步) 用js实现复杂的原理:用于发送请求的对象在不同的浏览器中是不同的 同源策略:ajax发送请求的url地址与服务器地址必须是同一域名,协议, ...

  7. 原生js封装ajax:传json,str,excel文件上传表单提交

    由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(u ...

  8. 初探原生js根据json数据动态创建table

    初探原生js根据json数据动态创建table 小生以实习生的职位进入了一家非纯软件的公司做asp.net开发,大半个月下来发现公司里居然没有前端工程师,这令我很诧异,跟着公司做项目,发现前端后台没有 ...

  9. JQuery和原生JS跨域加载JSON数据或HTML。

    前提:有时候需要在网页上,加载另一个网站上的数据.或者加载另一个网站上的一个页面.Js的Ajax请求不具备跨域功能,可以使用JQuery来实现. 网页端JS代码: $(function () { $. ...

随机推荐

  1. SQL语句(十八)—— 存储过程

    存储过程 系统存储过程 自定义存储过程 扩展存储过程 一.创建存储过程 创建存储过程 --例1 USE SU GO Create Procedure SelProc AS Select * From ...

  2. ZeroMQ API(四) 套接字

    1.创建一个套接字 1.1 zmq_socket(3) 1.1.1 名称 zmq_socket - 创建ZMQ套接字 1.1.2 概要 void * zmq_socket(void * context ...

  3. Android的音频解码原来是直接调用的本地C方法直接通过硬件解码

    Android就是披着JAVA外衣的C啊~音频解码原来是直接调用的本地C方法直接通过硬件解码的,JAVA和C的字节数组存放模式不同(java是大端,C根据不同平台不同),不同格式需要转化以后才能用. ...

  4. [整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题

    花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是遇到了些问题,特整理在此. <1>.由于node.msi安装包已经自动添加了 ...

  5. session使用

    Session的声明与使用 Session的设置不同于Cookie,必须先启动,在PHP中必须调用session_start().session_start()函数的语法格式如下: Bool sess ...

  6. kafka入门(2)- 环境部署

    部署Zookeeper(单机/集群) 1.下载安装文件: http://mirror.bit.edu.cn/apache/zookeeper/ 2.解压文件(本文解压到 D:\zookeeper-3. ...

  7. 训练赛第一场A题 (ZOJ 2313)

    解题报告:n个人围坐成一圈,并且将这n个人从1到n编号,然后编号为1 的人手上有一个物品,将这个物品往向左传递给第k个人,1<=k<=n/2,当这个物品再次传到编号为1 的人的手上时,游戏 ...

  8. C# XML序列化和反序列化

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  9. 解决 Windows 环境 Git Bash 无法识别 Composer 命令的问题

    思路 模拟 Linux,复制一个 composer 文件到 Git Bash 的 /usr 的子目录,并赋予执行权限. 解决 首先,请确定你的 composer.phar 文件路径.我的是: /d/w ...

  10. 【Linux技术】ubuntu常用命令【转】

    转自:http://www.cnblogs.com/lcw/p/3159462.html 查看软件xxx安装内容:dpkg -L xxx查找软件库中的软件:apt-cache search 正则表达式 ...