首页 > 解决方案 > 连续的承诺,声明的方式。如何?

问题描述

我有这个代码(它是由prettierbtw 格式化的):

    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 没有深度合并,所以我在这里丢失了一些信息。

知道如何让这些连续的承诺看起来更好,有一些清晰的短代码吗?

标签: typescriptramda.js

解决方案


感谢这个答案,我最终得到了这个:

    const gameInfoProcessed: ProcessedGameInfo = await R.pipeWith(R.andThen)([
      checkMissingRequiredKeys,
      checkUnsupportedKeys,
      checkReplayFileExists,
    ])(gameInfoInitial);

它似乎等同于初始代码,并且是声明性的,-我清楚地看到了所有功能;)


推荐阅读