Do
通常我们必须消除副作用,但在某些情况下不可避免的。DO扩展方法允许你注射副作用行为。DO扩展方法的签名看起来非常像Select方法:
- 他们都有各自不同的重载来满足和OnNext,OnError,OnCompleted配合
- 他们都接受并返回一个可观测物队列
Select重载接受Func参数来处理OnNext,同时也有能力返回一个与源类型不同的可观测物队列。与之相反,Do方法只接受一个Action<T>委托来处理OnNext,因此返回的与源队列类型相同。每个可以传递给Do方法重载的Action委托参数都带有副作用。
下面的例子中,我们首先为OnNext,OnError,OnCompleted三种情况定义了Log方法:
下面的代码可以用上面的方法输出Log:
Output:
Logging OnNext(0) @ 01/01/2012 12:00:00
0
Logging OnNext(1) @ 01/01/2012 12:00:01
1
Logging OnNext(2) @ 01/01/2012 12:00:02
2
Logging OnCompleted() @ 01/01/2012 12:00:02
completed
在上面的例子中我们看到,在Subscribe中只输出completed信息,而在输出Subscribe方法的completed信息之前Do方法却输出了所有的信息,这是由于Do在查询链中比Subscribe早,它更早接受到值,因此先输出。可以把Do方法想象为队列的窃听器,可以在队列中收听,而无需修改它。
RX中最常见的副作用用途是Log。Do方法的签名允许你注入到查询链中,这允许我们添加Log到我们的队列,并保留封装。当储存、服务代理或者提供者暴露可观测物队列,他们可以在队列公开之前添加他们的副作用(也就是Log)到队列。
下面的代码产生数字的同时也产生Log,对于代码来说Log是透明的
然后我们在这些代码中调用:
Output:
pushing 0 from GetNumbers
A
pushing 1 from GetNumbers
pushing 2 from GetNumbers
pushing 3 from GetNumbers
D
pushing 4 from GetNumbers
pushing 5 from GetNumbers
pushing 6 from GetNumbers
G
completed
这个例子说明了如何产生或中介可以应用Log到队列,而不管最终消费者做什么。
一个Do方法的重载允许传递一个IObserver<T>,在这个重载中, OnNext, OnError和OnCompleted方法各传递给另一个Do重载作为Action委托执行。
暂无关于此日志的评论。