Ramda.reject()如何与Promises一起使用?
map()
可以像这样工作
const data = [ {id: 1}, {id: 2} ]
const userIsAdmin = (user) => isAdmin(user) // async database call
const result = await Promise.all(R.map(userIsAdmin, data))
console.log(result) // [true, false]
但我真正想要的是恢复用户ID,但拒绝管理员。我使用pipeP
尝试了以下代码和其他变体。
await Promise.all(R.reject(async (d) => await userIsAdmin(d))(data))
如何做到这一点?
另一种方法是重构isAdmin()
以接受数组并等待一个承诺完成。
答案 0 :(得分:2)
我不确定我是否完全关注,但你不能简单地对reject
的结果使用Promise.all
吗?
const result = await Promise.all(R.map(asyncFn, data))
console.log(result) //=> [true, false]
console.log(R.filter(R.identity, result)) //=> [true]
但也许有些混乱。你确实想用reject
来做它的意图,对吗?它只是filter
的变体,谓词被颠倒,即(curried)等价于(fn, list) => R.filter(R.complement(fn), list)
。它与提供给Promise构造函数中给出的回调的reject
函数无关。
通过更新的问题,我认为最简单的方法仍然是reject
调用Promise.all
调用的结果,但您可能需要将其与原始数据结合使用。类似的东西:
const removeAdmins = pipe(zip, reject(head), pluck(1))
removeAdmins(result, data)
zip
将两个(等长)列表组合成对。然后调用该对上的head
会返回布尔值,因此reject(head)
会过滤掉true
次调用中返回Promise.all
的内容。然后pluck(1)
返回每个剩余对中的第二个元素(原始对象)。
那会做你想要的吗?