javascript - 使用 Ramda 拒绝 promise

标签 javascript ramda.js

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 .all 调用。然后 pluck(1) 从剩余的每一对中返回第二个元素(原始对象)。

这会如你所愿吗?

关于javascript - 使用 Ramda 拒绝 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44276356/

相关文章:

javascript - 如何从动态镜头获得动态 View

javascript - 运行 Screeps 游戏脚本时出错

javascript - "arguments"变量从哪里来 "this.callParent(arguments)"?

javascript - 如何使用主干将 'this' 传递给事件?

javascript - 如何查找数组中所有出现的元素的索引(Ramda.js 方式)?

javascript - 构建自己的调用栈

javascript - 使用字符串 + 字符串数组过滤对象数组

javascript - 如何将按钮添加到无状态组件中?

javascript - 大型生产应用程序的插入符、波形符或固定 package.json?

javascript - lambda js : lens for deeply nested objects with nested arrays of objects