国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 > web前端 > js教程 > 正文

讓JS自動匹配出proto Js的方法

php中世界最好的語言
發(fā)布: 2018-03-16 10:49:12
原創(chuàng)
2039人瀏覽過

這次給大家?guī)碜孞S自動匹配出proto Js的方法,JS自動匹配出proto Js的方法的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。

在與后端的WebSocket通信時,前端要帶一個proto文件是一個累贅的事情。首先是明顯的曝光了協(xié)議實體對象,再一個瀏覽器客戶端很容易會緩存該文件,新的協(xié)議更新可能導(dǎo)致客戶端不能使用,另外在cdn服務(wù)器上還需要配置.proto類型客戶端才能下載過去。真是遺毒不淺,自己使用的時候會注意這些,但給別人使用的時候就很不樂觀了,所以這次全部將proto文件轉(zhuǎn)成JavaScript對象,省去協(xié)議文件和加載的步驟。

先看代碼:

  args = [].slice.call(arguments, 1 obj =  ( i = 0; i < args.length; i++ p = key = i + 1 protobuf.Field(p[0], key, p[1] || "string" obj =  ( i = 0; i < list.length; i++ ( protobuf == "undefined") ;=  protobuf.Root().define("IMEntity""Token", ["UserID"], ["Token"], ["Device"], ["Version", "int32"], ["Appkey""Feedback", ["ResultCode", "int32"], ["ResultData"], ["Seq", "int32"], ["MsgID""ReceiptType", ["Receive", "Read"
    };
登錄后復(fù)制

proto 主要有兩種類型,Type和Enum。Type對應(yīng)協(xié)議中的message,相當(dāng)于是類。Enum就是枚舉類型

var Root  = protobuf.Root,
    Type  = protobuf.Type,
    Field = protobuf.Field;var AwesomeMessage = new Type("AwesomeMessage").add(new Field("awesomeField", 1, "string"));var root = new Root().define("awesomepackage").add(AwesomeMessage);
登錄后復(fù)制

枚舉的創(chuàng)建不要需要Field。只需要add 字段名即可。那么接下來的問題是,手寫root.add 也很煩,因為要一個一個對照屬性,不斷的復(fù)制粘貼,很容易出錯。所以又做了個自動生成代碼的頁面:

 <textarea id="content">        //登陸Token        message Token{
        string UserID = 1;    //登陸接口返回的IMUserID
        string Token = 2;    //登陸接口返回的Token
        string Device = 3;    //客戶端設(shè)備號
        int32  Version = 4;    //版本號,發(fā)布前與服務(wù)端約定值
        string Appkey = 5;    //客戶端Appkey        }       
        //收到私信        message ReceivePrivateMessage{
        string MsgID = 1;        //消息id
        string SenderID = 2;    //發(fā)送者id
        string ReceiverID = 3;    //接收者id
        string Content  = 4;    //消息內(nèi)容。客戶端轉(zhuǎn)換成業(yè)務(wù)相關(guān)的實體后,再做后續(xù)處理(客戶端使用,服務(wù)器不做任何處理,原樣下發(fā))
        bool Ack = 5;              //是否需要已讀回執(zhí)
        int32 SendDateTime = 6;    //消息發(fā)送時間
        int32 ContentType = 7;    //內(nèi)容類型(客戶端使用,服務(wù)器不做任何處理,原樣下發(fā))        }        //回執(zhí)類型        enum ReceiptType{
        Receive = 0;                      //已收回執(zhí)(收到消息后立即發(fā)送給服務(wù)器的回執(zhí))
        Read = 1;                        //已讀回執(zhí)(用戶進(jìn)入消息閱讀界面后發(fā)送給服務(wù)器的回執(zhí))        }    </textarea>
    <p id="result"></p>
    <script>        function start() {
            $("#result").html("");
            $("#result").append('root = new protobuf.Root().define("IMProtoEntity")<br>');            var reg = /("([^\"]*(\.)?)*")|('([^\']*(\.)?)*')|(/{2,}.*?(
|
))|(/*(
|.)*?*/)/g,// 過濾注釋
          str = $('#content').val(); // 欲處理的文本
            // console.log(str.match(reg));// 打印出:匹配子串
            var news = str.replace(reg, "");            // console.log(news); // 打印出:原文本
            var reg1 = /[message|enum].*?{/mg;            var regobj = /{[^}{]*?}/g;//新地址
            var names = news.match(reg1);            var protos = news.match(regobj);            // console.log(names, protos);
            var root = {};            for (var i = 0; i < names.length; i++) {                var rawname = names[i];                var rawObj = protos[i];                //if (~rawname.indexOf("message"))
                if (!rawObj) continue;                var name = rawname.replace("{", '').replace("message ", '').replace("enum ", '');                var obj = { name: name };                if (~rawname.indexOf("enum")) {
                    obj["type"] = "enum";
                }
                rawObj = rawObj.replace("{", '').replace("}", '');                var protolist = rawObj.split(';');                //  console.log("protolist", protolist);
                var plist = [];                for (var j = 0; j < protolist.length; j++) {                    var p = $.trim(protolist[j]);                    if (p) {                        var args = [];                        var list = p.split(' ');                        //  console.log("list", list);
                        list.forEach(function (n) {
                            n && args.push(n);
                        }),                        //  console.log("args", args);                        plist.push(args);
                    }
                }
                obj.list = plist;
                console.log(obj);
                toProto(obj);
            }
        }
        start();        function toProto(obj) {            var root = "root";            var fun = "createProto";            var enumfun = "createEnum";            var str = root + '.add(';            var args;            if (!obj.type) {//message
                args = '';                for (var i = 0; i < obj.list.length; i++) {                    var item = obj.list[i];                    //老協(xié)議2.0
                    if (item[0] == "required" || item[0] == "optional") {
                        item.shift();
                    }                    //新協(xié)議3.0
                    if (item[0] != "string") {
                        args += '["' + item[1] + '","' + item[0] + '"]';
                    } else {
                        args += '["' + item[1] + '"]';
                    }                    if (i < obj.list.length - 1) args += ",";
                }
            } else {//enum
                args = '[';                for (var i = 0; i < obj.list.length; i++) {                    var item = obj.list[i];
                    args += '"' + item[0] + '"';                    if (i < obj.list.length - 1) args += ",";
                }
                args += ']';
            }            var all = str + (obj.type ? enumfun : fun) + '("' + obj.name + '",' + args + '));';            //  console.log(all);
            $("#result").append(all + "<br>");
        }    </script>
登錄后復(fù)制

然后頁面上會得到:

紅色部分復(fù)制到工程里面就可以用了。當(dāng)然要帶上createProto和createEnum兩個方法。proto的格式要規(guī)范,畢竟start里面是以空格split的。相對于protobuf.load("xx.proto",callback)的方式要好很多。load對位置要求比較死板,一定要在根目錄。而且有類型不存在就會報錯,終止程序。add方法不存在找不到類型的錯誤。另外速度也快了很多。?

相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關(guān)注php中文網(wǎng)其它相關(guān)文章!

推薦閱讀:

怎樣讓js暫停執(zhí)行

jquery做出評分系統(tǒng)

以上就是讓JS自動匹配出proto Js的方法的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號