typescript - 连续的承诺,声明的方式。如何?
问题描述
我有这个代码(它是由prettier
btw 格式化的):
const gameInfoProcessed: ProcessedGameInfo = await checkMissingRequiredKeys(
gameInfoInitial
).then((i) =>
checkUnsupportedKeys(i).then((i) => checkReplayFileExists(i))
);
它完全按照我的意愿工作,但它看起来有点太奇怪了,我想要一些更具声明性、更清晰的方式。
我的一个想法是使用 Ramda 的管道:
const gameInfoProcessed: ProcessedGameInfo = await R.pipe(
checkMissingRequiredKeys,
checkUnsupportedKeys,
checkReplayFileExists,
)(gameInfoInitial);
这几乎是完美的,除了它不起作用:我所有的函数都是异步的,结果与现实生活不同,在编程中,promise 不能放入管道中。虽然有pipeP
一个管道的承诺版本,这大概是我需要的,但他们在 v0.26.0 中弃用了它,在较新的版本中我看不到这个功能可用(而且我不想使用弃用的狗屎,-应该有它被弃用的原因???)。
我知道 Promise.all 也可以:
const gameInfoProcessed: ProcessedGameInfo = R.mergeAll(
(await Promise.all(
[
checkMissingRequiredKeys(gameInfoInitial),
checkUnsupportedKeys(gameInfoInitial),
checkReplayFileExists(gameInfoInitial),
],
)),
);
它有点混乱,但至少我可以清楚地看到我的函数,这有点像我想要的......但由于几个不同的原因,它不等同于我的初始代码,其中一个是mergeAll
, - 因为我得到列表或个人结果,并且 mergeAll 没有深度合并,所以我在这里丢失了一些信息。
知道如何让这些连续的承诺看起来更好,有一些清晰的短代码吗?
解决方案
感谢这个答案,我最终得到了这个:
const gameInfoProcessed: ProcessedGameInfo = await R.pipeWith(R.andThen)([
checkMissingRequiredKeys,
checkUnsupportedKeys,
checkReplayFileExists,
])(gameInfoInitial);
它似乎等同于初始代码,并且是声明性的,-我清楚地看到了所有功能;)
推荐阅读
- hyperledger-fabric - Hyperledger Fabric:从使用 Node SDK 编写的链代码中调用 Python 脚本
- javascript - 为什么拖动事件上的 ctrlKey 属性没有立即更新?
- r - 在R中绘制不同颜色的累积直方图
- php - 计算两个日期之间的夜间时间
- node.js - 如何在 node.js lambda 中使用请求模块
- java - camunda 中 activitieventlistener 的替代方法是什么?
- java - 为什么我的 Swing GUI 没有显示所有添加的按钮?
- ios - UIActivityViewController 的标记被解除后方向错误
- c# - 如何填充多列?
- javascript - 通过jquery动态添加的输入字段未提交