寫在前面最近在總結(jié)自己在業(yè)務(wù)開發(fā)中遇到的問題,經(jīng)過思考,發(fā)現(xiàn)了一個(gè)可能值得總結(jié)一下的點(diǎn):使用Pull模型來實(shí)現(xiàn)業(yè)務(wù)邏輯。 背景先不管什么是Pull模型,我們先來看下面的場景: 有一個(gè)異步操作A,A完成后,需要根據(jù)A返回的結(jié)果,再進(jìn)行下一步的業(yè)務(wù)邏輯。 一種很常見的實(shí)現(xiàn)方式是:
這種實(shí)現(xiàn)方式?jīng)]有什么大問題。但是考慮這樣一個(gè)問題: 經(jīng)過一段時(shí)間的迭代,業(yè)務(wù)邏輯M和業(yè)務(wù)邏輯N越來越復(fù)雜。這個(gè)時(shí)候,產(chǎn)品經(jīng)理突然要加一個(gè)前置條件:異步操作A完成后,如果返回值是true,那么需要先進(jìn)行一個(gè)異步操作B,如果B返回的同樣是true,再進(jìn)行業(yè)務(wù)邏輯M。當(dāng)這種情況越來越多時(shí),這個(gè)時(shí)候,代碼維護(hù)起來就比較麻煩了。
我之前就遇到了這個(gè)問題。 怎么解決要解決這個(gè)問題,其實(shí)很簡單。使用promise 和 await。
改造后的代碼,我們就可以很方便的添加前置邏輯、和分支條件判斷了。 Pull模型之所以await可以解決上述問題,是因?yàn)椋涸谖铱磥?,await其實(shí)可以看做是一個(gè)Pull模型。所謂Pull模型,其實(shí)是來自消息中間件的一個(gè)概念。簡單來說,Pull模型就是:我需要什么數(shù)據(jù)的時(shí)候,我再去拿。與之對(duì)應(yīng)的,是Push模型:數(shù)據(jù)產(chǎn)生了,給你拿去用吧。 結(jié)合上面的代碼來看,我們來看看Push模型和Pull模型的區(qū)別。 Push模型:
上面的代碼,異步函數(shù)執(zhí)行完成后,回調(diào)函數(shù)會(huì)立即執(zhí)行。如果我們想判斷異步函數(shù)執(zhí)行的結(jié)果后,再去做邏輯,就必須再callback里面寫代碼。異步函數(shù)直接把數(shù)據(jù)Push給了回調(diào)函數(shù),回調(diào)函數(shù)會(huì)立即執(zhí)行。 Pull模型:
上面的代碼,從異步函數(shù)中Pull了數(shù)據(jù)后,先進(jìn)行判斷,然后再進(jìn)入回調(diào)函數(shù)里面的邏輯。 在我平時(shí)的業(yè)務(wù)開發(fā)中,會(huì)涉及到許多的異步操作,每一個(gè)異步操作都涉及到時(shí)序性問題和條件分支問題。使用Pull模型,可以很好的處理異步操作之間的時(shí)序問題,并且把代碼中的許多if else外置,每一個(gè)函數(shù)專心實(shí)現(xiàn)一個(gè)業(yè)務(wù)邏輯,方便維護(hù),且不易出錯(cuò)。Pull模型可以增強(qiáng)我們對(duì)于異步操作的控制能力。 寫在后面業(yè)務(wù)中使用await來書寫代碼,可以解決許多問題,其根本原因是await和回調(diào)函數(shù)在思想上就是不一樣的。本次總結(jié),某種程度上加深了自己對(duì)于語言的理解,符合預(yù)期。 |
|