乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      使用Pull模型來實(shí)現(xiàn)前端的業(yè)務(wù)邏輯

       新進(jìn)小設(shè)計(jì) 2020-03-12

      寫在前面

      最近在總結(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)方式是:

      A(res => {
        if(res === true) {
          // 業(yè)務(wù)邏輯M
        } else {
          // 業(yè)務(wù)邏輯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ù)起來就比較麻煩了。

      A(resA => {
        if(resA === true) {
          B(resB => {
            if(resB === true) {
              // 業(yè)務(wù)邏輯M
            }
          })
        } else {
          // 業(yè)務(wù)邏輯N
        }
      });

      我之前就遇到了這個(gè)問題。

      怎么解決

      要解決這個(gè)問題,其實(shí)很簡單。使用promise 和 await。

      const resA = await PromiseA();
      if(resA === false) {
        // 業(yè)務(wù)邏輯N
        return ;
      }
      const resB = await PromiseB();
      if(resB === true) {
        // 業(yè)務(wù)邏輯M
      }

      改造后的代碼,我們就可以很方便的添加前置邏輯、和分支條件判斷了。

      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模型:

      const asyncFn = function() {};
      const callback = function(res) {
        if(res === true) {
          // ....
        }
      };
      asyncFn(callback);

      上面的代碼,異步函數(shù)執(zhí)行完成后,回調(diào)函數(shù)會(huì)立即執(zhí)行。如果我們想判斷異步函數(shù)執(zhí)行的結(jié)果后,再去做邏輯,就必須再callback里面寫代碼。異步函數(shù)直接把數(shù)據(jù)Push給了回調(diào)函數(shù),回調(diào)函數(shù)會(huì)立即執(zhí)行。

      Pull模型:

      const callback = function() {};
      const asyncFn = async function() {};
      const asyncRes = await asyncFn();
      if(asyncRes === true) {
              callback();
      }

      上面的代碼,從異步函數(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ù)期。

      最新的.png

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多