JavaScript惰性函数

你好


我想在这里告诉您有关使用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) //  Future   .map(multiply10); //     lazyMultiply10(2).fork(console.error, console.log); // -> 20 

太笨了,不是吗? 让我们尝试使用第二种方法更简洁地编写。


 const multiply10 = x => x * 10; const lazyMultiply10 = Future.map(multiply10); const value = Future.of(2); //     Future lazyMultiply10(value).fork(console.error, console.log); // -> 20 

已经好了,但仍然很麻烦。 它必须更紧凑!


 const lazyMultiply10 = Future.map(x => x * 10); lazyMultiply10(Future.of(2)).fork(console.error, console.log); // -> 20 

实际上,这些方法不是互相排斥的,可以一起使用。


 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); // -> 110 

错误处理


实际上,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); // -> [Result1, Result2, Result3] 

承诺兼容


JavaScript中没有Promise的位置,如果您的方法返回一些晦涩的Future,那么任何人都不会高兴。 为此,Future具有.promise()方法,该方法将开始执行Future并将其包装在Promise中。


 Future .of(10) .promise(); // -> Promise{value=10} 

参考文献



也许这就是我想告诉你的。 如果主题很有趣,请告诉我,我将告诉您有关错误处理的更多信息。 是的,不要太责骂我,这是我在哈布雷的第一篇文章。

Source: https://habr.com/ru/post/zh-CN435838/


All Articles