1. 程式人生 > >jsonrpc.js -- 原生js實現 JSON-RPC 協議

jsonrpc.js -- 原生js實現 JSON-RPC 協議

href 一次 nts 批量 項目 消息接收 傳遞方式 結果 send

很早以前就涉及到多端遠程調用 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 協議