使用Ramda处理asynchronous编程

我正在寻找处理函数,返回承诺与拉普达function,然后pipeP。 我试图比较函数(其中之一返回一个承诺)与这样的等于:

getSectionFromDb :: obj -> promise getSectionFromData :: obj -> number R.equals( getSectionFromDb, getSectionFromData ) 

这里有两个因素。 首先R.equals不会评估函数,但更大的问题是,我将一个承诺与一个数字进行比较。

有没有这样的东西(我知道function不参考透明,但必须有办法处理IO)的function方式? 有没有拉姆达这样做的方式?

谢谢。

       

网上收集的解决方案 "使用Ramda处理asynchronous编程"

您可以使用Promise.resolve在承诺中“包装”一个值。

 getSectionFromDataPromise :: obj -> promise getSectionFromDataPromise = R.pipe(getSectionFromData , (val) => Promise.resolve(val)) 

这样,你可以提升(提升)任何返回正常值的函数返回一个promise。

起重是FP中一个重要的概念。 您可以将Array.map作为一个函数来提升函数,该函数将值转换为转换值数组的函数。

你可以使用Promise.all来编写一个比较承诺的函数,例如,如果不相等,会抛出一个错误。

 function promiseEquals (f1, f2) { return Promise.all([f1(), f2()]).then(function(vals) { if(!R.equals(vals[0], vals[1])) {throw "The values aren't equal"} return vals[0] }) } 

最后你可以结合这两个:

 promiseEquals(getSectionFromDataPromise, getSectionFromDb) .then(function(val){ console.log(val) }) .catch(function(val){console.log("Error "+val)}) 

我知道,这个问题很老。 但是ramda有一些很酷的function来编写Promise-returning函数: pipeP和composeP 。

还要看看正规组合 ( pipe道 ),它是Kleisli实施composeK ( pipeK )。 他们允许使用像Future和Task这样的代数结构,它看起来和Promise相同,但是懒惰的评估。