摘要:需求描述進(jìn)行復(fù)雜項(xiàng)目開發(fā)時(shí),服務(wù)端數(shù)據(jù)接口實(shí)現(xiàn)端會(huì)把接口拆分的比較細(xì)粒度,以方便在更多地方復(fù)用。
需求描述
進(jìn)行復(fù)雜項(xiàng)目開發(fā)時(shí),服務(wù)端(數(shù)據(jù)接口實(shí)現(xiàn)端)會(huì)把接口拆分的比較細(xì)粒度,以方便在更多地方復(fù)用。而拆分后的接口在前端進(jìn)行組合請(qǐng)求時(shí),通常會(huì)出現(xiàn)一個(gè)區(qū)塊要請(qǐng)求5、6個(gè)接口甚至更多接口請(qǐng)求才能拿到想要的數(shù)據(jù),過多的數(shù)據(jù)請(qǐng)求會(huì)導(dǎo)致區(qū)塊渲染較慢,移動(dòng)端表現(xiàn)尤為明顯。
為了改善這種情況,也有在服務(wù)端再開發(fā)一些新接口來進(jìn)行combine前端需要用的接口,不過開發(fā)和維護(hù)都不是很好,我們應(yīng)該把這個(gè)過程自動(dòng)化掉
類比cdn文件combine的思路,前端在請(qǐng)求時(shí)對(duì)接口動(dòng)態(tài)combine,后端有一個(gè)專門處理combine接口的服務(wù)接口。我們?cè)谶@個(gè)過程中約定好前后端的數(shù)據(jù)格式即可
約定假設(shè)我們要請(qǐng)求如下2個(gè)接口
接口: users/list 參數(shù): status=1 name=xl 接口: users/role 參數(shù): id=20
我們假設(shè)客戶端對(duì)上述2個(gè)接口combine后發(fā)送如下格式的請(qǐng)求到服務(wù)端
接口 api/combine 參數(shù) apis=[{ url:"users/list", body:{ status:1, name:xl } },{ url:"users/role", body:{ id:20 } }]
服務(wù)端實(shí)現(xiàn)一個(gè)固定的api/combine接口,接收到上述數(shù)據(jù)后,內(nèi)部再去請(qǐng)求相應(yīng)的接口,拿到數(shù)據(jù)后返回如下的數(shù)據(jù)格式
{ "users/list":{data:{},ok:true}, "users/role":{data:{},ok:true} }在Magix中的應(yīng)用
var Service = Magix.Service.extend(function(bag, callback) { var bags = bag.get("bags", []); //啟用接口combine后,所有的請(qǐng)求都會(huì)走combine,Magix內(nèi)部會(huì)把要請(qǐng)求的bag對(duì)象放到bags數(shù)組內(nèi) var data = []; for (var i = 0; i < bags.length; i++) { var params = bags[i].get("params"); //單個(gè)接口要發(fā)送給服務(wù)端的數(shù)據(jù) data.push({ url: bags[i].get("url"), body: params }); } $.ajax({ url: "api/combine", data: "apis=" + JSON.stringify(data), dataType: "json", type:"post", success: function(responseData) { for (var i = 0; i < bags.length; i++) {//拆分統(tǒng)一返回的數(shù)據(jù) var url = bags[i].get("url"); var d = responseData[url];//根據(jù)url讀取相應(yīng)的數(shù)據(jù) if (d) { bags[i].set("data", d);//設(shè)置數(shù)據(jù) } } callback(); } }); }); Service.add([{ name: "list", url: "users/list", cache: 100000 }, { name: "role", url: "users/role" }]);
使用
var s1 = new Service(); s1.all("list", function(err, list) { console.log(err, list); }); setTimeout(function() { var s = new Service(); s.all(["list", "role"], function(err, list, role) { console.log(err, list, role); }); }, 6000);
兼容之前的所有功能及cache,該功能需要后端根據(jù)約定配合,約定并非要按照前面描述的規(guī)則,可以自己定義,只需要在Magix.Service.extend中自己處理好即可
Magix是一個(gè)區(qū)塊化管理框架:https://github.com/thx/magix/...
項(xiàng)目地址:https://github.com/thx/magix
歡迎star與fork
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80251.html
摘要:一收集器接口陳楊收集器接口匯聚操作的元素類型即流中元素類型匯聚操作的可變累積類型匯聚操作的結(jié)果類型接口一種可變匯聚操作將輸入元素累積到可變結(jié)果容器中在處理完所有輸入元素后可以選擇將累積的結(jié)果轉(zhuǎn)換為最終表示可選操作歸約操作 一、Stream收集器 Collector接口 package com.java.design.java8.Stream; import com.java.desi...
摘要:我們先看看的初始化函數(shù)的完整定義,看構(gòu)造一個(gè)模型可以輸入哪些參數(shù)我們可以將類的構(gòu)造函數(shù)中的參數(shù)分為以下幾組基礎(chǔ)參數(shù)我們訓(xùn)練的模型存放到指定的目錄中。看完模型的構(gòu)造函數(shù)后,我們大概知道和端的模型各對(duì)應(yīng)什么樣的模型,模型需要輸入什么樣的參數(shù)。 Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右發(fā)布的一類用于分類和回歸的模型,并應(yīng)用到了 Google Play ...
摘要:寫這個(gè)文章其實(shí)主要是因?yàn)閯傆袀€(gè)童鞋問了個(gè)問題正寫的帶勁安利的實(shí)現(xiàn)方式,結(jié)果還沒寫完無意發(fā)現(xiàn)問題被關(guān)閉了哎都寫了一半了又不想放棄,就干脆寫成文章問題主要就是把集合里的數(shù)據(jù)按照一定大小順序平均分成若干組的問題,看起來挺簡(jiǎn)單的,不過我開始看到就想 寫這個(gè)文章其實(shí)主要是因?yàn)閯傆袀€(gè)童鞋問了個(gè)問題https://segmentfault.com/q/10...正寫的帶勁安利Java8的實(shí)現(xiàn)方式,結(jié)...
摘要:一自定義收集器陳楊將集合轉(zhuǎn)換為集合存放相同元素二自定義收集器陳楊將學(xué)生對(duì)象按照存放從中間容器數(shù)據(jù)類型轉(zhuǎn)換為結(jié)果類型數(shù)據(jù)類型一致若不一致拋出類型轉(zhuǎn)換異常對(duì)中間容器數(shù)據(jù)結(jié)果類型進(jìn)行強(qiáng)制類型轉(zhuǎn)換多個(gè)線程同時(shí)操作同一個(gè)容器并行多線 一、自定義SetCustomCollector收集器 package com.java.design.Stream.CustomCollector; impor...
閱讀 3433·2021-11-22 09:34
閱讀 1899·2019-08-30 12:53
閱讀 3490·2019-08-28 18:07
閱讀 2976·2019-08-27 10:55
閱讀 2959·2019-08-26 10:12
閱讀 3584·2019-08-23 18:21
閱讀 1338·2019-08-23 14:10
閱讀 1469·2019-08-23 13:04