你好
我想在这里告诉您有关使用Fluture库在JavaScript中如何创建和使用惰性函数的信息。 这将是有关如何创建函数,如何处理错误以及并发性的简要概述。 函数式编程的大脑我不会so! 我保证!
绒毛
Fluture是由开发人员Aldwin Vlasblom开发的实现Future的库。 Future是Promise的替代产品,Promise具有更强大的API,该API可以实现取消,安全的“递归”,“无错误”执行(使用Either)和一小部分凉快的功能。
我认为有必要向您介绍我将在以下示例中使用的方法(monad)。
.of(Any)
-根据传递的值创建一个Future.map(Function)
-不,这不是Array.map
,这是类似于Promise.then
的转换函数.chainRej(Function)
-像Promise.catch
捕获错误.fork(Function, Function)
-开始将来执行
创建一个惰性函数
对于我自己,我确定了在Fluture中创建懒函数的两种主要方法。 第一种方法是我们创建一个接受源数据并返回准备执行的Future函数。 第二种方法是我们使用描述的所有转换创建一个Future,然后将数据传递给它。
不清楚 让我们举个例子吧! 我们有这样的功能
const multiply10 = x => x * 10;
现在使用第一种方法使她懒惰
const multiply10 = x => x * 10; const lazyMultiply10 = (x) => Future .of(x)
太笨了,不是吗? 让我们尝试使用第二种方法更简洁地编写。
const multiply10 = x => x * 10; const lazyMultiply10 = Future.map(multiply10); const value = Future.of(2);
已经好了,但仍然很麻烦。 它必须更紧凑!
const lazyMultiply10 = Future.map(x => x * 10); lazyMultiply10(Future.of(2)).fork(console.error, console.log);
实际上,这些方法不是互相排斥的,可以一起使用。
const lazyMultiply10 = Future.map(x => x * 10); const someCalculation = a => Future .of(a) .map(v => v + 1) .chain(v => lazyMultiply10(Future.of(v)); someCalculation(10).fork(console.error, console.log);
错误处理
实际上,Future中的错误处理与Promise中的错误处理没有什么不同。 让我们 记住 想象一个向第三方(不是很稳定)的API发出请求的函数。
const requestToUnstableAPI = query => request({ method: 'get', uri: `http://unstable-site.com/?${query}` }) .then(res => res.data.value) .catch(errorHandler);
功能相同,但包装在将来
const lazyRequestToUnstableAPI = query => Future .tryP(() => request({ method: 'get', uri: `http://unstable-site.com/?${query}` })) .map(v => v.data.value) .chainRej(err => Future.of(errorHandler(err));
实际上,可以使错误处理更加灵活。 为此,我们需要Either结构,而这种微小的范围超出了我的审查范围。
并发
为了使用并行,Future实现了两种方法race(Futures[])
(类似于Promise.race
), parallel(n, Futures[])
和both(Future, Future)
,但这是parallel
的特例。
parallel
方法采用两个参数,即并行Future的数量和带有Future的数组。 为了使parallel
行为与Promise.all
方法相同,您需要将Promise.all
次数设置为Infinity
。
在这里,我们也离不开示例。
const requestF = o => Future.tryP(() => request(o)); const parallel1 = Future.parallel(1); const lazyReqs = parallel1( [ 'http://site.com', 'http://another-site.com', 'http://one-more-site.com', ] .map(requestF) ); lazyReqs.fork(console.error, console.log);
承诺兼容
JavaScript中没有Promise的位置,如果您的方法返回一些晦涩的Future,那么任何人都不会高兴。 为此,Future具有.promise()
方法,该方法将开始执行Future并将其包装在Promise中。
Future .of(10) .promise();
参考文献
也许这就是我想告诉你的。 如果主题很有趣,请告诉我,我将告诉您有关错误处理的更多信息。 是的,不要太责骂我,这是我在哈布雷的第一篇文章。