很早以前就涉及到多端远程调用 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. python基础之生成器迭代器

    1 生成器: 为什么要有生成器? 就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止.如果我们要创建 ...

  2. python的map函数的使用方法详解以及使用案例(处理每个元素的自增、自减、平方等)

    1.用我们之前学过的求一下平方(只有一个列表) #求平方 num=[1,5,6,2,7,8] a=[] for n in num: a.append(n**2) print (a) C:\python ...

  3. git 使用 gitignore

    git 使用 git简介 git 命令 git  忽略文件 git   作用:版本控制 Git 是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Li ...

  4. 跟上Java8 - 日期和时间实用技巧

    原文出处:王爵nice 当你开始使用Java操作日期和时间的时候,会有一些棘手.你也许会通过System.currentTimeMillis() 来返回1970年1月1日到今天的毫秒数.或者使用Dat ...

  5. idea 安装lombok 插件过程

    一.作用 Lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,bean,entity等类,绝大部分数据类类中都需要get.set.toStrin ...

  6. Web Uploader

    Github上的例子没看太明白,在网上找了些资料自己写了个demo,基本上就是用create方法初始化,然后on一堆事件,上传的进度条用的是swf格式的动画,感觉不是很先进的样子.不过我暂时也没搞明白 ...

  7. XML学习(1)

    什么是XML? XML是可拓展标记语言,类似HTML,它的设计宗旨是为了传输数据,而不是像HTML那样显示数据.XML标签没有被预定义,需要用户自定义标签. xml文档必须包含根元素,它是其他所有元素 ...

  8. ZigBee介绍

    ZigBee网络 什么是ZigBee技术 Zigbee在中国被译为"紫蜂",是一种基于IEEE802.15.4协议的最近发展起来的一种短距离无线通信技术,功耗低,被业界认为是最有可 ...

  9. sqlmap tamper脚本

    本文来自:SQLmap tamper脚本注释, 更新了一些脚本,<<不断更新中>> 目前已经总共有50+的脚本,故对源文章进行更新... sqlmap-master ls -l ...

  10. Python练习-三级菜单与"片儿"无关!

    # 编辑者:闫龙 #三级目录 menu = { '北京':{ '海淀':{ '五道口':{'soho':{},'网易':{},'google':{}}, '中关村':{'爱奇艺':{},'汽车之家': ...