Status

一切都是為了追蹤狀態而生

在講述細節前,需要先了解狀態,狀態是Nucleoid的主幹,Gene大部分的表現都會建立狀態,這些狀態會依序堆疊再一起,直到Transcription結束後擲出。

這是難以繼續使用async.js的主因,在Lambda上要追蹤整個過程實在太過困難。


編譯過後的JS

身為JS專家的你,我相信對於babeleslintuglify都不陌生,這些好用的工具經常伴隨著webpackCI/CD一起運作,serverless也不例外。

以下是經常出現在cloud watch log的錯誤訊息:

{
    "errorMessage": "a is not a function",
    "errorType": "TypeError",
    "stackTrace": [
        "update (/var/task/functions/index.js:1989:9)"
    ]
}

變數名稱:不可考

錯誤行數:不可考

黑人問號


所有行為都有狀態

所有狀態的注入都是被動行為,在每一塊template運行時就會產生專屬的status物件,並把當下的表現綁定在該status中。

var gene = Nucleoid.createGene()

gene.template('template1', (base, enzy, next) => {
    // 這兩塊都有各自的status物件,但無法在這觀測它
    next()
})

gene.template('template2', (base, enzy, next) => {
    // 這兩塊都有各自的status物件,但無法在這觀測它
    next()
})

手動加入註記

template中只能藉由下列兩支API添加參考給status

enzy是一個小型函式庫,後面的章節會介紹。

enzy.setStatusAttr(key, value)
enzy.setRootStatusAttr(key, value)
gene.template('template1', (base, enzy, next) => {
    // 註記當下的Status
    enzy.setStatusAttr('now', 'now status.')
    // 註記源頭Status
    enzy.setRootStatusAttr('root', 'hello root.')
    next()
})

特殊表現下的Status

termination

termination的執行會配給一個status作為參數,它是所有status樹中的最外層,也就是root status。

gene.setTermination((base, status) => {
    if (base.$error) {
        status.addAttr('error', base.$error)
    }
})

traceBaseMode

traceBaseMode則會得到當下狀態和一個clone base。

gene.setTraceBaseMode(true, (cloneBase, status) => {
    status.addAttr('base', cloneBase)
})