最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

koa-compose簡單實(shí)現(xiàn)及使用的妙處

 更新時間:2023年04月11日 10:00:04   作者:翰玥  
這篇文章主要為大家介紹了koa-compose簡單實(shí)現(xiàn)及使用的妙處詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

場景

今年的行情真的是非常的差,而且面試的時候卷的不行。前段時間,有個朋友去面了某大廠,竟然被問到了手寫一個koa-compose。那咱們今天就簡單的實(shí)現(xiàn)一個看看到底難不難。

面試官讓你實(shí)現(xiàn)一個場景:有一件衣服單價50元,買了num件,總和打了8折,然后運(yùn)費(fèi)是12元,算出買這num件衣服加上運(yùn)費(fèi)算上折扣需要多少錢?

首先需要實(shí)現(xiàn)三個函數(shù)

const express = (total) => {
  return total + 12;
};
const discount = (total) => {
  return total * 0.8;
};
const TShirtNum = (num) => {
  return 50 * num;
};

TShirtNum代表num件衣服需要的費(fèi)用,discount表示打了8折之后的費(fèi)用,express表示算上運(yùn)費(fèi)的費(fèi)用。

現(xiàn)在要求實(shí)現(xiàn)一個compose函數(shù),然后調(diào)用這個函數(shù),并把上面三個函數(shù)傳入compose函數(shù)中,最后計(jì)算出結(jié)果。比如

const sellTshirt = compose([TShirtNum, discount, express]);
sellTshirt(100)

sellTshirt(100)會計(jì)算出最后的結(jié)果。如果要計(jì)算出最后的結(jié)果,就需要將TShirtNum計(jì)算出的結(jié)果傳給discount,然后discount計(jì)算出的結(jié)果傳給express。

此時我們可以使用reduce實(shí)現(xiàn)。MDN介紹reduce為:reduce()  方法對數(shù)組中的每個元素按序執(zhí)行一個由您提供的 reducer 函數(shù),每一次運(yùn)行 reducer 會將先前元素的計(jì)算結(jié)果作為參數(shù)傳入,最后將其結(jié)果匯總為單個返回值。

第一次執(zhí)行回調(diào)函數(shù)時,不存在“上一次的計(jì)算結(jié)果”。如果需要回調(diào)函數(shù)從數(shù)組索引為 0 的元素開始執(zhí)行,則需要傳遞初始值。否則,數(shù)組索引為 0 的元素將被作為初始值 initialValue,迭代器將從第二個元素開始執(zhí)行(索引為 1 而不是 0)。

很顯然compose需要返回一個函數(shù)

const compose = (funcArr) => (startNum) => funcArr.reduce((pre, cur) => cur(pre), startNum) 

一行代碼解決。startNum表示我們需要購買的數(shù)量,當(dāng)做reduce的初始值,然后將上一次計(jì)算的結(jié)果傳給下一個函數(shù),相當(dāng)于是TShirtNum計(jì)算的結(jié)果傳給discount, 也就是我們代碼中實(shí)現(xiàn)的cur(pre)。最后即可計(jì)算出結(jié)果。redux源碼就是這樣實(shí)現(xiàn)的??

koa-compose實(shí)現(xiàn)

現(xiàn)在面試官將這三個方法改造了一下。

const express = (total, next) => {
  console.log("starting, express"); // 3
  next(total + 12);
  console.log("ending, express"); // 4
};
const discount = (total, next) => {
  console.log("starting, discount"); // 2
  next(total * 0.8); 
  console.log("ending, discount"); // 5
};
const TShirtNum = (num, next) => {
  console.log("starting, TShirtNum"); // 1
  next(15 * num); 
  console.log("ending, TShirtNum"); // 6
};

要求按照順序打印結(jié)果。同時會看到每個函數(shù)中都多了一個next方法。仔細(xì)觀察你會發(fā)現(xiàn),next其實(shí)就是調(diào)用下一個方法。我們用一個圖來表示:

下面我們用代碼實(shí)現(xiàn)一下

function compose(arr) {
  let result;
  return function (ctx) {
    let dispatch = function (i, ctx) {
      let fn;
      if (i < arr.length) {
        fn = arr[i];
      }
      if (i === arr.length) {
        result = ctx;
        return;
      }
      return fn(ctx, dispatch.bind(null, ++i));
    };
    dispatch(0, ctx);
    return result;
  };
}
const sellTshirt = compose([TShirtNum, discount, express]);
console.log(sellTshirt(100));

由于最后執(zhí)行的是sellTshirt(100),所以需要返回一個函數(shù)。在這個函數(shù)內(nèi)部定義一個dispatch方法,然后首次執(zhí)行傳入一個i為0,代表arr中的第一個函數(shù),執(zhí)行這個函數(shù)。在執(zhí)行這個函數(shù)的時候需要多傳入一個參數(shù)作為next, 而這個參數(shù)就是dispatch,傳入的時候,i遞增,代表arr中可以取下一個函數(shù)了。當(dāng)執(zhí)行next的時候其實(shí)就是執(zhí)行dispatch。最后執(zhí)行的結(jié)果為:

其實(shí)就是用遞歸的思想去實(shí)現(xiàn)。大家可以去看下koa-compose的源碼基本上也就是這樣。

以上就是koa-compose簡單實(shí)現(xiàn)及使用的妙處的詳細(xì)內(nèi)容,更多關(guān)于koa-compose簡單實(shí)現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • nodejs調(diào)取微信收貨地址的方法

    nodejs調(diào)取微信收貨地址的方法

    這篇文章主要為大家詳細(xì)介紹了nodejs調(diào)取微信收貨地址的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • node.js中http模塊和url模塊的簡單介紹

    node.js中http模塊和url模塊的簡單介紹

    這篇文章主要給大家簡單介紹了關(guān)于node.js中的http模塊和url模塊,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用node.js具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 如何解決安裝websocket還是報錯Cannot find module'ws'問題

    如何解決安裝websocket還是報錯Cannot find module'ws&apos

    這篇文章主要介紹了如何解決安裝websocket還是報Cannot find module'ws'問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • node.js中fs文件系統(tǒng)模塊的使用方法實(shí)例詳解

    node.js中fs文件系統(tǒng)模塊的使用方法實(shí)例詳解

    這篇文章主要介紹了node.js中fs文件系統(tǒng)模塊的使用方法,結(jié)合實(shí)例形式詳細(xì)分析了node.js fs文件系統(tǒng)模塊各種常見方法的基本使用技巧與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • windows如何把已安裝的nodejs高版本降級為低版本(圖文教程)

    windows如何把已安裝的nodejs高版本降級為低版本(圖文教程)

    這篇文章主要介紹了windows如何把已安裝的nodejs高版本降級為低版本,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • express+multer上傳圖片打開亂碼問題及解決

    express+multer上傳圖片打開亂碼問題及解決

    這篇文章主要介紹了express+multer上傳圖片打開亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Nodejs 構(gòu)建Cluster集群多線程Worker threads

    Nodejs 構(gòu)建Cluster集群多線程Worker threads

    這篇文章主要為大家介紹了Nodejs 構(gòu)建Cluster集群多線程Worker threads示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • node.js中的http.response.removeHeader方法使用說明

    node.js中的http.response.removeHeader方法使用說明

    這篇文章主要介紹了node.js中的http.response.removeHeader方法使用說明,本文介紹了http.response.removeHeader的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js實(shí)現(xiàn)簡單爬蟲示例詳解

    node.js實(shí)現(xiàn)簡單爬蟲示例詳解

    這篇文章主要為大家介紹了node.js實(shí)現(xiàn)簡單爬蟲示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 從零揭秘npm install的黑科技

    從零揭秘npm install的黑科技

    通過npm package manager來安裝和管理包是我們最為常見的方式之一,本文將從淺入深地帶大家剖析一下npm install的執(zhí)行過程,感興趣的可以學(xué)習(xí)一下
    2023-05-05

最新評論

巴彦淖尔市| 岳普湖县| 南充市| 沭阳县| 玉山县| 易门县| 昭平县| 工布江达县| 天等县| 博白县| 霍邱县| 墨江| 久治县| 衡东县| 福安市| 游戏| 伊吾县| 五莲县| 黄大仙区| 白朗县| 连州市| 泽州县| 平和县| 大埔区| 抚远县| 丰原市| 舒城县| 柳州市| 盐城市| 扶沟县| 石泉县| 高清| 阿鲁科尔沁旗| 新乡县| 合江县| 马尔康县| 通河县| 江都市| 抚松县| 金平| 永城市|