jsonrpc.js -- 原生js實現 JSON-RPC 協議
很早以前就涉及到多端遠程調用 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.addCommand(name,func,opt) Function
註冊可以被遠程端調用的方法
Arguments
- name(String): 方法的名字
- func(Function): 對應的方法
- opt(Object): { sync: false,//默認情況,函數返回不是Promise且為undefind時不調用回調 always: false,//默認情況,函數回調一次就不在調用回調,設置true可以一直回調,但是需要使用 }
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,//函數回調不會清除引用,用於響應多child消息回調 ...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
本地可以理解為客戶端,接收到返回消息,執行回調之前
EXAMPLE
沒有實際項目應用,只是覺得需要支持
test.html
基本消息傳遞的例子
sync.html
同步函數情況下,對返回值undefind的特殊處理
send.html
通過_call,從消息體本身的設計,限制服務端執行邏輯
result.html
通過_guid,從消息體本身的設計,限制客戶端對回調消息的執行
always1.html
應對服務器端消息 分多次返回
always2.html
應對客戶端發送多個服務器端消息,都進行響應
jsonrpc.js -- 原生js實現 JSON-RPC 協議