使用Ramda拒绝承诺

时间:2017-05-31 05:27:39

标签: 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()以接受数组并等待一个承诺完成。

1 个答案:

答案 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)返回每个剩余对中的第二个元素(原始对象)。

那会做你想要的吗?