pPassThrough

pPassThrough

  • async (value: any, fnArray: async function[]) => Result
  1. Pass a value through asynchronous functions, returning the result.

    Each function takes the result of the prior function as its parameter.

    const increment = async n => n + 1
    const double = async n => n * 2
    const toAnswer = async n => 'answer: ' + n
    
    const result1 = await pPassThrough(1, [increment, double, toAnswer])
    console.log(result1) // is 'answer: 4'
    
    const result2 = await pPassThrough(1, [])
    console.log(result2) // is 1
    const increment = async (n: number) => n + 1
    const double = async (n: number) => n * 2
    const toAnswer = async (n: number) => 'answer: ' + n
    
    const result1 = await pPassThrough(1, [increment, double, toAnswer])
    console.log(result1) // is 'answer: 4'
    
    const result2 = await pPassThrough(1, [])
    console.log(result2) // is 1
    
    const increment = async n => n + 1
    const double = async n => n * 2
    const toAnswer = async n => 'answer: ' + n
    
    const result1 = await pPassThrough(1, [
      increment,
      double,
      toAnswer,
    ])
    console.log(result1) // is 'answer: 4'
    
    const result2 = await pPassThrough(1, [])
    console.log(result2) // is 1
    const increment = async (n: number) => n + 1
    const double = async (n: number) => n * 2
    const toAnswer = async (n: number) =>
      'answer: ' + n
    
    const result1 = await pPassThrough(1, [
      increment,
      double,
      toAnswer,
    ])
    console.log(result1) // is 'answer: 4'
    
    const result2 = await pPassThrough(1, [])
    console.log(result2) // is 1
    
  2. Sometimes we want to pass a value through asynchronous functions to process a result. Below, we're coding the checkout stage to our online shop. Let's first call the API to assign our shipping amount, then finalize the total.

    const mockSalesTax = 0.08
    const mockShipping = 10
    
    const mockStoreApi = {
      assignShipping: async order => ({
        ...order,
        shipping: mockShipping,
      }),
      finalizeTotal: async order => ({
        ...order,
        salesTax: mockSalesTax,
        total: order.subtotal * (1 + mockSalesTax) + order.shipping,
      }),
    }
    
    const userLocation = 'cleveland'
    const shoppingCart = ['broom', 'mop', 'detergent']
    const order = {
      cart: shoppingCart,
      destination: userLocation,
      subtotal: 26,
    }
    const updatedOrder = await pPassThrough(order, [
      mockStoreApi.assignShipping,
      mockStoreApi.finalizeTotal,
    ])
    
    console.log(updatedOrder)
    // prints
    // {
    //   cart: [broom, mop, detergent]
    //   destination: cleveland
    //   subtotal: 26
    //   shipping: 10
    //   salesTax: 0.08
    //   total: 38.08
    // }
    type Order = {
      cart: string[]
      destination: string
      salesTax: number
      shipping: number
      subtotal: number
      total: number
    }
    
    const mockSalesTax = 0.08
    const mockShipping = 10
    
    const mockStoreApi = {
      assignShipping: async (order: Order): Promise<Order> => ({
        ...order,
        shipping: mockShipping,
      }),
      finalizeTotal: async (order: Order): Promise<Order> => ({
        ...order,
        salesTax: mockSalesTax,
        total: order.subtotal * (1 + mockSalesTax) + order.shipping,
      }),
    }
    
    const userLocation = 'cleveland'
    const shoppingCart = ['broom', 'mop', 'detergent']
    const order = {
      cart: shoppingCart,
      destination: userLocation,
      subtotal: 26,
    } as Order
    const updatedOrder = await pPassThrough(order, [
      mockStoreApi.assignShipping,
      mockStoreApi.finalizeTotal,
    ])
    
    console.log(updatedOrder)
    // prints
    // {
    //   cart: [broom, mop, detergent]
    //   destination: cleveland
    //   subtotal: 26
    //   shipping: 10
    //   salesTax: 0.08
    //   total: 38.08
    // }
    
    const mockSalesTax = 0.08
    const mockShipping = 10
    
    const mockStoreApi = {
      assignShipping: async order => ({
        ...order,
        shipping: mockShipping,
      }),
      finalizeTotal: async order => ({
        ...order,
        salesTax: mockSalesTax,
        total:
          order.subtotal * (1 + mockSalesTax) +
          order.shipping,
      }),
    }
    
    const userLocation = 'cleveland'
    const shoppingCart = ['broom', 'mop', 'detergent']
    const order = {
      cart: shoppingCart,
      destination: userLocation,
      subtotal: 26,
    }
    const updatedOrder = await pPassThrough(order, [
      mockStoreApi.assignShipping,
      mockStoreApi.finalizeTotal,
    ])
    
    console.log(updatedOrder)
    // prints
    // {
    //   cart: [broom, mop, detergent]
    //   destination: cleveland
    //   subtotal: 26
    //   shipping: 10
    //   salesTax: 0.08
    //   total: 38.08
    // }
    type Order = {
      cart: string[]
      destination: string
      salesTax: number
      shipping: number
      subtotal: number
      total: number
    }
    
    const mockSalesTax = 0.08
    const mockShipping = 10
    
    const mockStoreApi = {
      assignShipping: async (
        order: Order
      ): Promise<Order> => ({
        ...order,
        shipping: mockShipping,
      }),
      finalizeTotal: async (
        order: Order
      ): Promise<Order> => ({
        ...order,
        salesTax: mockSalesTax,
        total:
          order.subtotal * (1 + mockSalesTax) +
          order.shipping,
      }),
    }
    
    const userLocation = 'cleveland'
    const shoppingCart = ['broom', 'mop', 'detergent']
    const order = {
      cart: shoppingCart,
      destination: userLocation,
      subtotal: 26,
    } as Order
    const updatedOrder = await pPassThrough(order, [
      mockStoreApi.assignShipping,
      mockStoreApi.finalizeTotal,
    ])
    
    console.log(updatedOrder)
    // prints
    // {
    //   cart: [broom, mop, detergent]
    //   destination: cleveland
    //   subtotal: 26
    //   shipping: 10
    //   salesTax: 0.08
    //   total: 38.08
    // }
    
  3. When to use pPassThrough vs. pCompose?

    They can often be used interchangeably. Compose allows you to name a group of functions, which can sometimes be helpful. Other times a name is unnecessary, and you just want to pass data through.