【问题标题】:Is it ok to use Maybe<T> and Result<T> types in Typescript/Javascript?可以在 Typescript/Javascript 中使用 Maybe<T> 和 Result<T> 类型吗?
【发布时间】:2017-06-03 11:01:44
【问题描述】:

在 TS 中有一个很好的链接异步方法的机制:promises。 你可以做1.then(()=>...).catch(()=>...)。

但是如果我想链接同步方法怎么办? 在这个问题How to avoid logic duplication when promisifying js methods? 我是建议不要使用承诺来做到这一点。

在 C# 中,我很高兴使用 Maybe 和 Result 类来做到这一点。 任何方法都会返回一个类Result。它将有方法 OnSuccess(将方法的结果传递给它)和 OnFailure(将错误传递给它)。

使用这些类的 TS 代码如下所示:

public processAndDouble(input: number) : number {
    return processData(input)
      .onSuccess((processedInput)=>{
        return processedInput * 2;
      })
      .onFailure((error)={
        return 0;
      })
}

public processData(input: number) : Result<number> {
  if(input >= 0)
    return Result.Ok(input + 1);
  else
    return Result.Fail("can't process negative numbers");
}

那么,问题是,使用这种方法可以吗?

这不与一些最佳实践、原则相矛盾吗?

【问题讨论】:

  • 只要您 100% 确信链中永远不会有单个异步调用,就可以了。一旦发生,您必须将所有内容都转换为 Promise。
  • 谢谢你,Artem,我喜欢你的回答。我说的是同步。操作。讨厌将它们作为变量声明和赋值的序列。

标签: javascript c# typescript functional-programming


【解决方案1】:

在打字稿中有更好的处理异步方法的机制:async/await。因此,在您的情况下,如果您将根方法定义为异步,您可以轻松地将同步和异步方法“链接”在一起,而无需额外头痛:

class A
{
    public async processAndDouble(input: number): Promise<number>
    {
        try
        {
            //Sync method
            let processedInput = this.processDataSync(input);
            //Async method
            processedInput = await this.processDataAsync(processedInput);
            //Sync operation again
            return processedInput * 2;
        }
        catch (error)
        {
            return 0;
        }
    }

    public async processDataAsync(input: number): Promise<number>
    {
        if (input >= 0)
        { 
            //Do your async operation here
            return input + 1;
        }
        else
        {
            throw new Error("can't process negative numbers");
        }
    }

    public processDataSync(input: number): number
    {
        if (input >= 0)
        { 
            return input + 1;
        }
        else
        {
            throw new Error("can't process negative numbers");
        }
    }
}

请注意,您仍然可以使用直观的异常机制 - 因此无需弄乱成功/拒绝处理程序。

希望这会有所帮助。

【讨论】:

  • 中间,我不能同意。您建议依靠 try-catch-error 机制。 Result.Fail() 比错误更有意义。它返回等待和预测的“空”结果。 OnSuccess/OnFailure 方法强制开发人员处理调用者方法中的情况。另一方面,js 中的错误就像 C# 中的异常。如果您忘记处理它 - 繁荣 - 应用程序崩溃。完全不同。以及我之前被建议反对的同步操作的承诺。虽然,我不明白为什么它不好。实际上,它就像 Result 类。
  • 这种讨论会很快超出当前问题的范围。请记住,这是我个人的观察,并不假装是绝对真理。我只会记下一些你可能认为有用的东西。开发人员忘记捕获错误或忘记处理 OnFailure 处理程序之间没有区别 - 应用程序将崩溃或将继续但出现意外结果,更好的是取决于您。另一方面,使用 async/await 的 try/catch 使代码级别更易于阅读和维护 - 从而减少了开发时间和错误。
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多