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这样做的方式?
谢谢.
您可以使用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)
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)
归档时间: |
|
查看次数: |
7542 次 |
最近记录: |