使用Ramda处理asynchronous编程
我正在寻找处理函数,返回承诺与拉普达function,然后pipeP。 我试图比较函数(其中之一返回一个承诺)与这样的等于:
getSectionFromDb :: obj -> promise getSectionFromData :: obj -> number R.equals( getSectionFromDb, getSectionFromData )
这里有两个因素。 首先R.equals不会评估函数,但更大的问题是,我将一个承诺与一个数字进行比较。
有没有这样的东西(我知道function不参考透明,但必须有办法处理IO)的function方式? 有没有拉姆达这样做的方式?
谢谢。
您可以使用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相同,但是懒惰的评估。