foreach跳出本次循环 js判断空对象的方法( 二 )

让我们来看一个遵循命令式模型的“ calculatePrice”函数的实现:
const calculatePrice = (price, tax, discount) => {const priceWithTaxes = withTaxes(tax, price);if (isError(priceWithTaxes)) {return console.log('Error: ' + priceWithTaxes.message);}const priceWithTaxesAndDiscount = withDiscount(discount, priceWithTaxes);if (isError(priceWithTaxesAndDiscount)) {return console.log('Error: ' + priceWithTaxesAndDiscount.message);}console.log('Total Price: ' + priceWithTaxesAndDiscount);}//我们计算出价值25的产品(含21%的增值税和10%的折扣)的最终价格 。calculatePrice(25, 0.21, 0.10)现在,让我们了解如何使用Either Monad重写此函数 。
都有两个构造函数,Left和Right 。我们要实现的是将异常存储到Left构造函数,并将正常结果(快乐路径)存储到Right构造函数 。
首先,将更改已经存在的withTaxes和withDiscount函数,以便在出现错误时它们返回Left,在一切正常的情况下返回Right:
const withTaxes = Ramda.curry((tax, price) => {if (!_.isNumber(price)) {return RamdaFantasy.Either.Left(new Error("Price is not numeric"));}return RamdaFantasy.Either.Right(price + (tax * price)); });const withDiscount = Ramda.curry((dis, price) => {if (!_.isNumber(price)) {return RamdaFantasy.Either.Left(new Error("Price is not numeric"));}if (price < 5) {return RamdaFantasy.Either.Left(new Error("Discounts not available for low-priced items"));}return RamdaFantasy.Either.Right(price - (price * dis)); });
然后,我们为Right案例创建一个函数(显示价格),为Left案例创建另一个函数(显示错误),然后使用它们创建Either Monad:
const showPrice = (total) => { console.log('Price: ' + total) }; const showError = (error) => { console.log('Error: ' + error.message); }; const eitherErrorOrPrice = RamdaFantasy.Either.either(showError, showPrice);最后,只需要执行Monad来计算最终价格:
//计算出价值25的产品(含21%的增值税和10%的折扣)的最终价格 。eitherErrorOrPrice(RamdaFantasy.Either.Right(25).chain(withTaxes(0.21)).chain(withDiscount(0.1)))结论:JavaScript中的函数式编程正如我们所看到的,一旦用Maybe和Either单子分解了代码,就没有那么复杂了 。如果使用得当,它们可以使我们的代码更易于阅读和维护 。
【foreach跳出本次循环 js判断空对象的方法】唯一的不便是我们需要克服的初始障碍,但这可以通过在网上一些示例并进行一些测试来完成 。

推荐阅读