使用Ramda处理异步编程

BBS*_*BBS 15 javascript node.js ramda.js

我正在寻找处理函数,这些函数返回与除了pipeP之外的Ramda函数的promises.我试图比较函数(其中一个返回一个承诺)与这样的等于:

getSectionFromDb :: obj -> promise
getSectionFromData :: obj -> number

R.equals(
    getSectionFromDb,
    getSectionFromData
)
Run Code Online (Sandbox Code Playgroud)

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

有没有一种功能性的方式来做这种事情(我知道函数不是参考透明,但必须有一种方法来处理io)?有没有Ramda这样做的方式?

谢谢.

Ale*_*ich 9

我知道,问题是陈旧的.但ramda有一些很酷的函数来组成Promise- returns函数:pipePcomposeP.

另外看看常规的compose(管道)和它的Kleisli实现composeK(pipeK).它们允许使用像Future或Task这样的代数结构,它们与Promise相同,但是懒惰评估.

  • 从 0.26.0 开始,pipeP 和 composeP 被弃用,取而代之的是 https://ramdajs.com/docs/#pipeWith 和 https://ramdajs.com/docs/#composeWith (3认同)

Bob*_*off 5

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

getSectionFromDataPromise :: obj -> promise
getSectionFromDataPromise = R.pipe(getSectionFromData , (val) => Promise.resolve(val))
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以将任何返回正常值的函数提升(提升)为返回承诺的函数。

提升是 FP 中的一个基本概念。您可以将其Array.map视为提升将值转换为转换值数组的函数的函数。

您可以使用Promise.all编写一个函数来比较 Promise 并且(例如)如果它们不相等则抛出错误。

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]
  })
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以将两者结合起来:

promiseEquals(getSectionFromDataPromise, getSectionFromDb)
  .then(function(val){
    console.log(val)
  })
  .catch(function(val){console.log("Error "+val)})
Run Code Online (Sandbox Code Playgroud)

  • @arcseldon 你可以做`getSectionFromDataPromise = R.pipe(getSectionFromData, Promise.resolve.bind(Promise));` (3认同)

epi*_*age 5

pipeP并被composeP弃用。

创建pipeWithPromise它接受一系列承诺或函数。

var pipeWithPromise = R.pipeWith((fun, previousResult) => (previousResult && previousResult.then) ? previousResult.then(fun) : fun(previousResult));
var tasks = [/* sync func */ $ => $ + '1', /* async func */ async $ => await $ + '2'];
var result = await pipeWithPromise(tasks)('state');
// result = 'state12';
Run Code Online (Sandbox Code Playgroud)