在Swift中链接异步函数
在本文中,我们将看到如何在Swift中使用函数组合来链接多个异步请求(不必用于RxSwift)。
编辑:Brandon Kase指出,这种组合实际上称为Kleisli组合,并且要使用的正确运算符是fish / Kleisli运算符:
>=>
(而不是|>
)。这很棒! 一件事:我建议使用> =>运算符代替|>,因为|>(称为管道转发)传统上用于向后函数应用程序。 您在这里拥有的是kleisli合成(并且> =>是kleisli合成运算符)。
-Brandon Kase(@bkase_) 2018年2月1日
[您可以下载本文的配套 Playground 。]
假设我们有一个具有以下模型的付款验证应用程序:
对Web服务的一般请求可能如下所示:
正如您应该猜到的那样,我们将使用函数组合来实现这一点。
让我们采用通用请求函数:
func fetch(_输入:InputType,完成:(Result )->无效)
并用以下别名表示它:
公共类型别名Request =(T,@转义RequestCompletion )->无效
在我们的例子中,U将映射到 Result
。
接下来,我们将定义一个运算符,该运算符将允许我们通过管道传递请求。
分解> =>运算符
该运算符是T
, U
和V
三种类型的泛型运算符,并使用2个函数f
和g
作为参数,其中:
-
f
取一个T
并以Result
-
g
取一个U
并以Result
。
它返回一个带有签名的组合函数: Request<T, Result>
即接受f
输入并以Result
完成的函数。
注意:
- 输入为
T
类型 - CombineCompletion的类型为RequestCompletion
RequestCompletion<Result>
。
这个返回函数的实现从应用f
开始,然后在f
的完成块中,它切换一个Result
。
- 如果
f
以.success
,它将使用成功值并调用g
。g
完成时(带有Result
),它将对该result
执行combineCompletion
。 - 如果
f
以.failure
完成,.failure
它不会再继续移动,并调用带有相应错误的combineCompletion
。
完成此操作后,我们上面的复杂验证代码将变为:
我们首先用3个请求组成一个validation
函数。 然后,要执行实际的验证,我们只需传入客户标识符,然后在其完成块中打开result
以查看是否能够成功获取客户的所有必需属性。
这里的所有都是它的!
将您的意见留在评论部分。