Status Data
有狀態了,然後呢?
Status
是一個物件,而不是一個export
出某些對外的API,這意味著你可以嘗試解讀輸出的狀態,而Status
本身也有幾個API可以幫助你建立介面或直接產生介面。
get
get
會歷遍當下status
對象以下的所有子節點,回傳一個結果物件。
var gene = Nucleoid.createGene('look status')
gene.template('add status', (base, enzy, next) => {
enzy.setStatusAttr('show', 'hello.')
next()
})
gene.transcription().then((messenger) => {
console.log(JSON.stringify(messenger.status.get(), null, 4))
})
以下是輸出root status的資料
{
"name": "look status",
"type": "root",
"detail": {
"operationTime": 12
},
"message": "",
"success": true,
"attributes": {},
"children": [
{
"name": "add status",
"type": "template",
"detail": {
"operationTime": 0
},
"message": "",
"success": true,
"attributes": {
"say": "hello."
},
"children": []
}
]
}
json
json()
是取得get
之後轉換成json
字串,但與直接stringify
不同的是,該function會檢查是否有迴圈結構。
var gene = Nucleoid.createGene('look json')
gene.template('add status', (base, enzy, next) => {
let loop = {}
loop.target = loop
enzy.setStatusAttr('show', loop)
next()
})
gene.transcription().then((messenger) => {
console.log(messenger.status.json())
})
輸出:
{
"name": "look json",
"type": "root",
"detail": {
"operationTime": 12
},
"message": "",
"success": true,
"attributes": {},
"children": [
{
"name": "add status",
"type": "template",
"detail": {
"operationTime": 0
},
"message": "",
"success": true,
"attributes": {
"show": {
"target": "Circular structure object." // 這個循環結構被阻擋掉了
}
},
"children": []
}
]
}
html
看這函數名就知道尊爵不凡,它能產生一組簡單的HTML,提升最終狀態的可視度。
var gene = Nucleoid.createGene('look html')
gene.template('add status', (base, enzy, next) => {
let loop = {}
loop.target = loop
enzy.setStatusAttr('show', loop)
next()
})
gene.transcription().then((messenger) => {
document.body.innerHTML = messenger.status.html()
})
輸出:
type : root
name : look json
detail :
{ "operationTime": 13 }
type : template
name : add status
detail :
{ "operationTime": 1 }
attributes(show) :
{ "target": "Circular structure object." }
Error Status
如果該模板執行fail
或宣告錯誤,該模板會呈現錯誤狀態。
當節點有錯誤
var gene = Nucleoid.createGene('look error')
gene.template('success', (base, enzy, next, exit, fail) => {
next()
})
gene.template('fail', (base, enzy, next, exit, fail) => {
// 宣告fail會擲出錯誤狀態
fail('fail test')
// 在try-catch-mode底下這樣也會擲出錯誤狀態
let a = 5
a()
})
gene.transcription().catch((messenger) => {
document.body.innerHTML = messenger.status.html()
})
輸出:
type : root
name : look json
message :
fail test
detail :
{ "operationTime": 11 }
type : template
name : success
detail :
{ "operationTime": 0 }
type : template
name : fail
只取得錯誤狀態
有時候會發現整包status
太大包了,有時候我們只需要post一些訊息給slack
之類的推播系統。
// 該函數可以得到平面化的錯誤資料
var gene = Nucleoid.createGene('look error')
gene.template('success', (base, enzy, next, exit, fail) => {
next()
})
gene.template('fail', (base, enzy, next, exit, fail) => {
fail('fail test')
})
gene.transcription().catch((messenger) => {
// status[0]是root,抓它形同抓整組出來
console.log(status.getErrorStatus().slice(1))
})
輸出:
[
{
"name": "fail",
"type": "template",
"detail": null,
"message": "",
"success": false,
"attributes": {},
"children": []
}
]