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()
以接受一个数组并等待一个 promise 完成。
最佳答案
我不确定我是否完全遵循,但你不能简单地对 Promise.all
的结果使用 reject
吗?
const result = await Promise.all(R.map(asyncFn, data))
console.log(result) //=> [true, false]
console.log(R.filter(R.identity, result)) //=> [true]
但也许有些困惑。你确实想使用 reject
它的目的是什么,对吧?它只是 filter
的变体,谓词颠倒了,即 (fn, list) => R.filter(R.complement(fn), list)< 的(curried)等价物
。它与提供给 Promise 构造函数中给定回调的 reject
函数无关。
更新
对于更新后的问题,我认为最简单的方法仍然是对 Promise.all
调用的结果使用 reject
,但您可能必须将它结合起来与原始数据。像这样的东西:
const removeAdmins = pipe(zip, reject(head), pluck(1))
removeAdmins(result, data)
zip
将两个(等长)列表组合成对。然后调用 head
给你返回 bool 值,所以 reject(head)
过滤掉那些从你的 Promise 返回
调用。然后 true
.allpluck(1)
从剩余的每一对中返回第二个元素(原始对象)。
这会如你所愿吗?
关于javascript - 使用 Ramda 拒绝 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44276356/