果然是越用越熟練矩桂,上次對(duì)于 await 和 async 還比較模糊,現(xiàn)在熟悉多了痪伦。
先用 promise 代替回調(diào)函數(shù)
第一次聽說 promise 還是因?yàn)?axios侄榴,一介紹 axios 就會(huì)提及promise,不懂咋辦网沾?學(xué)唄癞蚕。
于是惡補(bǔ)基礎(chǔ)知識(shí)。
先掌握基本用法辉哥,然后就可以去封裝基礎(chǔ)功能了桦山,比如indexedDB的訪問,webSQL的訪問等醋旦。
await 等待一下
一開始使用 then的方式恒水,后來發(fā)現(xiàn),簡(jiǎn)單的情況還可以浑度,但是復(fù)雜的情況就沒法看了寇窑,于是開始使用await鸦概。
然后知道了箩张,還可以有返回值,返回值就是 then的參數(shù)窗市,怪不得參數(shù)只能有一個(gè)呢先慷。
forEach 的 await
const cols = [...]
cols.forEach(async (col, index) => {
col.tableId = intTableId
col.columnId = intTableId + (index + 1) * 10
col.canNull = 0
myLog.start(col.colName, logIndex)
res = await service(columnId, 10, col, -2, 'meta')
myLog.end(res.newId, logIndex)
})
一開始這么寫,但是運(yùn)行后發(fā)現(xiàn)咨察,只是函數(shù)內(nèi)部等待了论熙,但是遍歷卻沒有等待,還在繼續(xù)遍歷摄狱。
這個(gè)就脓诡,如果不需要對(duì)應(yīng)的話无午,那么就無所謂了,但是如果想要對(duì)應(yīng)上祝谚,那么目前的辦法宪迟,還是改成for循環(huán)。
for 的 await
for (let index = 0; index < cols.length; index++) {
const col = cols[index]
col.tableId = intTableId
col.columnId = intTableId + (index + 1) * 10
col.canNull = 0
myLog.start(col.colName, logIndex)
res = await service(columnId, 10, col, -2, 'meta')
myLog.end(res.newId, logIndex)
}
改成 for 的方式交惯,就可以在循環(huán)內(nèi)部進(jìn)行等待了次泽。
async 的返回值
一開始以為 標(biāo)記 async 的函數(shù),因?yàn)楸粡?qiáng)制變成返回 promise 的實(shí)例席爽,于是就無法設(shè)置返回值了呢意荤,后來發(fā)現(xiàn)我又錯(cuò)了。
還是可以設(shè)置返回值的只锻,返回值會(huì)成為 then 的參數(shù)玖像,也就是 await 的返回值。于是我們可以套娃了齐饮。
只是容易暈的套娃御铃。
好吧,代碼寫了五百多行沈矿,我也不知道套了幾層上真。
const _moduleId = 150
const pagerId = 151
/**
* 菜單和分頁,存入SQL羹膳,返回分頁的 meta
*/
const addModuleSQL = async () => {
// 模塊菜單
myLog.newLog('模塊菜單')
let res = await service(_moduleId, 10, moduleInfo.moduleModal, -2, 'meta')
myLog.end(res.newId)
// 分頁
const pager = {
moduleId: moduleInfo.moduleModal.moduleId, // 分頁ID, int
showCols: '', // 顯示字段, 數(shù)組
query: '', // 查詢條件, 對(duì)象
pageSize: 10, // 一頁記錄數(shù), int
pageTotal: 100, // 總記錄數(shù), int
pageIndex: 1, // 第幾頁, int
OrderColumns: 'id', // 排序字段, 對(duì)象
fixedQuery: 'isDel = 0', // 固定查詢條件, 對(duì)象
fristQuery: '' // 首次查詢條件, 對(duì)象
}
myLog.newLog('列表的分頁')
res = await service(pagerId, 10, pager, -2, 'meta')
myLog.end(res.newId)
// 返回模塊的分頁信息
return pager
}
使用
const setMeta = async () => {
const newModuleMeta = { moduleId: moduleInfo.moduleModal.moduleId }
newModuleMeta.pager = await addModuleSQL()
newModuleMeta.button = await addButtonSQL()
newModuleMeta.find = await addFindSQL()
newModuleMeta.grid = await addGridSQL()
newModuleMeta.forms = await addFormSQL()
...
return newModuleMeta
}
這樣就可以無限套娃了睡互,如果你喜歡的話。