javascript - 在 Ramda 管道中使用 Promise.all

标签 javascript es6-promise ramda.js

Promise.all怎么样用于 ramda 管道?我想我在这里遗漏了一些愚蠢的东西。

const pipeline: Function = R.pipe(
    R.map((record) => record.body),
    R.map(JSON.parse),
    R.map(asyncFunction),
    console.log
);

返回一个 promise 数组(Promise.all 的输入)
[ Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> } ]

但是,如果我尝试等待这些 promise 通过 Promise.all 解决,像这样:
const pipeline: Function = R.pipe(
    R.map((record) => record.body),
    R.map(JSON.parse),
    R.map(asyncFunction),
    Promise.all,
    R.andThen(useTheReturn)
);

我最终得到一个类型错误,说明我正在尝试使用 Promise.all作为构造函数类型。
{
    "errorType": "TypeError",
    "errorMessage": "#<Object> is not a constructor",
    "stack": [
        "TypeError: #<Object> is not a constructor",
        "    at all (<anonymous>)",
        "    at /var/task/node_modules/ramda/src/internal/_pipe.js:3:14",
        "    at /var/task/node_modules/ramda/src/internal/_arity.js:11:19",
        "    at Runtime.exports.handler (/var/task/lambda/data-pipeline/1-call-summary-ingestion/index.js:14:19)",
        "    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
    ]
}

最佳答案

您需要绑定(bind) Promise.allPromise :

const pipeline: Function = R.pipe(
  R.map((record) => record.body),
  R.map(JSON.parse),
  R.map(asyncFunction),
  R.bind(Promise.all, Promise),
  R.andThen(useTheReturn)
);

演示:

const pipeline = R.pipe(
  R.bind(Promise.all, Promise),
  R.andThen(R.sum)
);

const promise1 = Promise.resolve(10)
const promise2 = 20
const promise3 = new Promise((resolve) => setTimeout(resolve, 100, 30))

const result = pipeline([promise1, promise2, promise3])

result.then(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>

关于javascript - 在 Ramda 管道中使用 Promise.all,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60446102/

相关文章:

javascript - 谷歌应用程序脚本,将对象从服务器发送到 HTML 模板和 javascript

javascript - Ramda如何将参数传递给高阶函数?

javascript - 我可以通过 Promise 的解析/拒绝来控制函数的流程吗?

javascript - 未处理的 Promise 拒绝警告 : TypeError: First argument must be a string or Buffer

javascript - 将对象数组合并为单个对象数组

javascript - 使用 Ramda 执行子数组的函数式方法

javascript - 原型(prototype)函数调用返回未定义

javascript - 在 socket.io 上发送发布数据或获取数据

javascript - 正则表达式过滤掉 Angular 中的 YouTube 视频

javascript - promise 订单调用