pPassThrough
pPassThrough
async (value: any, fnArray: async function[]) => Result
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
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 // }
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.