通过json 响应添加js function 增强业务灵活程度
直接在服务器的response中包含js 已经是比较常见的功能了,但是从业务角度,缺少灵活性,我们需要加载时候同时解析
基于模块快的加载机制是一个不错的选择(amd,cmd 都是不错的选择,类似的工具也很多),或者通过类型转换,比如json
object 到claas 这样我们也就能操作业务数据了,直接在json 数据中包含js function 也是一个不错的选择(可以服务端控制逻辑,但
是会存在大小的问题,但是我们也能解决,而且还会有一些安全的风险,但是还好,具体要看实现的技术了)
原理
- 参考json 格式
let userids = {
fetchid: function () {
return Promise.resolve({
name: "dalong1",
age: 22
})
},
fetchtext: function () {
return Promise.resolve({
name: "dalong2",
age: 33
})
},
login: function () {
return Promise.resolve({
name: "dalong3",
age: 44
})}
}
- 说明
此数据我们需要经过序列化给客户端,之后客户端,反序列化,然后我们就可以直接使用了 - 反序列化之后的格式
对于函数转换为了字符串
{"fetchid":"function () {\n return Promise.resolve({\n name: \"dalong1\",\n age: 22\n })\n }","fetchtext":"function () { \n return Promise.resolve({\n name: \"dalong2\",\n age: 33\n })\n }","login":"function () {\n return Promise.resolve({\n name: \"dalong3\",\n age: 44\n })}"}
参考效果
业务集成使用
如果需要使用此代码,我们需要进行反序列化的处理,因为默认的json 反序列化的不支持的,还好社区有类似的实现
- package.jon
{
"name": "class-transformer-learning",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"is-promise": "^4.0.0",
"json-fns": "^1.0.0",
}
}
- 代码
说明:就是使用了json-fns 处理包含js的json,然后直接可以像方一样使用代码了
const isPromise = require("is-promise")
const JSON = require('json-fns')
let userids = {
fetchid: function () {
return Promise.resolve({
name: "dalong1",
age: 22
})
},
fetchtext: function () {
return Promise.resolve({
name: "dalong2",
age: 33
})
},
login: function () {
return Promise.resolve({
name: "dalong3",
age: 44
})}
}
let info =JSON.stringify(userids)
console.log(info)
for (let key inJSON.parse(info)) {
if (userids.hasOwnProperty(key)) {
let element = userids[key];
if (isPromise(element)) {
element.then(data => {
console.log("default",data)
}).catch(err=>{
console.log("fetch",err)
})
}
else {
let funcCall = element();
if (isPromise(funcCall)) {
funcCall.then(data => {
console.log("fun call",data)
console.log(data)
}).catch(err=>{
console.log("default",err)
})
}
}
}
}
- 运行效果
说明
以上是一个实践的探索,基于此模式我们可以增强业务的灵活性,对于js的处理部分,我们可以基于nodejs 的生态或者基于gravvlvm(js 能力)
或者(golang 的gopherjs),deno(typescript 引擎,后边可能会调整)主要是很多时候我们的代码是需要编译的(js 新特性的兼容,有些语法是不能支持的)
参考资料
https://www.npmjs.com/package/json-fns
https://github.com/oracle/graal
https://github.com/gopherjs/gopherjs