- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已通读 ReactiveX文档多次,但我仍然无法准确理解观察者订阅 Observable 时会发生什么。
让我们看一个简单的例子:
import { Observable } from 'rxjs';
const observable = new Observable(subscriber => {
subscriber.next(1);
subscriber.complete();
});
const observer = {
next: (x) => console.log('got value ' + x),
error: (err) => console.error('something wrong occurred: ' + err),
complete: () => console.log('done')
};
observable.subscribe(observer);
subscriber
在哪里传递给 Observable 的对象从何而来?
It is not a coincidence that
observable.subscribe
andsubscribe
innew Observable(function subscribe(subscriber) {...})
have the same name. In the library, they are different, but for practical purposes you can consider them conceptually equal.
subscriber
)中订阅回调的对象是
不是 实际上是
observer
目的。至少如果你引用上面关于图书馆实际工作方式的引述,至少不会。
observer
传入的对象,那么
subscriber.next(1)
到底是什么和
subscribe.complete()
打电话?那如何连接到
next
observer
中的属性(property)?
最佳答案
Observable
创建流程如下:
一个 Observable
由作者定义(此处手动使用 new
,用于解释):
const myObservable = new Observable(function subscribe(subscriber) {
subscriber.next(1);
subscriber.next(2);
subscriber.complete();
return function tearDownLogic() {
console.log('runs when Observable for whatever reason is done (complete, error, or unsubscribed)')
}
});
subscribe
回调传递给
Observable
以上由
Observable constructor 本地保存:
constructor(subscribe?: (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic) {
if (subscribe) {
this._subscribe = subscribe;
}
}
subscribe
功能,由我们或任何其他预制
Observable
定义,保存下来以供以后执行。
subscribe
几种形式之一的回调。要么直接作为一到三个函数(next、error、complete),要么作为具有相同三个方法中的一个或多个的对象。出于解释的目的,我们将实现最后一个更详细的选项:
const observer = {
next(v) {
console.log(v);
}
error(err) {
console.log(err);
}
complete() {
console.log('Observable has now completed and can no longer emit values to observer');
}
}
observer
进入
Observable.subscribe(..)
方法:
myObserver.subscribe(observer);
subscribe(observerOrNext?: PartialObserver<T> | ((value: T) => void),
error?: (error: any) => void,
complete?: () => void): Subscription {
const { operator } = this;
const sink = toSubscriber(observerOrNext, error, complete);
if (operator) {
sink.add(operator.call(sink, this.source));
} else {
sink.add(
this.source || (config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
this._subscribe(sink) :
this._trySubscribe(sink)
);
}
if (config.useDeprecatedSynchronousErrorHandling) {
if (sink.syncErrorThrowable) {
sink.syncErrorThrowable = false;
if (sink.syncErrorThrown) {
throw sink.syncErrorValue;
}
}
}
return sink;
}
subscribe
方法:
observer
以之前讨论过的一种形式toSubscriber
将观察者转换为 Subscriber
对象,无论其传递形式如何(Subscriber
实例保存在 sink
变量中)operator
变量是 undefined
,除非您订阅运营商。因此,只需忽略 if
operator
周围的陈述Subscriber
扩展(原型(prototype)链接到)Subscription
对象,它的原型(prototype)上有两个重要的方法:unsubscribe()
, add()
add(..)
用于将“拆卸逻辑”(函数)添加到 Observable
,它将在 Observable
时运行完成或取消订阅。它将接受传递给它的任何函数,将其包装在 Subscription
中对象,并将函数放入 Subscription
的_unsubscribe
多变的。这个Subscription
保存在 Subscriber
我们在上面创建了一个名为 _subscriptions
的变量.如前所述,我们这样做是为了当 Subscriber
已取消订阅或已完成,所有 add()
'ed 拆除逻辑执行 Observable.subscribe()
返回 Subscriber
实例。因此,您可以调用mySubscriber.add( // some tear down logic)
随时在其上添加将在 Observable
时执行的函数已完成或已取消订阅 this._trySubscribe(sink)
运行(在 add()
内,作为参数)。 _trySubscribe(..)
是实际运行 subscribe
的函数之前由 Observable
保存的回调构造函数。重要的是,它传入 sink
(我们的新 Subscriber
实例)作为对 Observable
的回调打回来。换句话说,当 subscriber.next(1)
里面Observable
执行,我们实际上是在执行 next(1)
在 sink
( Subscriber
)实例( next()
在 Subscriber
的原型(prototype)上)。 toSubscribe
里面有更多细节以及取消订阅流程等,但这些超出了本问答的范围。
Observable
中。 , 只是在转换为统一的
Subscriber
之后目的。
关于javascript - 在 RxJS 中,Observer 是否被注入(inject)到 Observable 执行中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54446138/
我已阅读有关依赖注入(inject)的信息。然后来了 构造函数注入(inject), setter/getter 注入(inject) 二传手注入(inject) 接口(interface)注入(in
我正在研究依赖注入(inject)模式。我看过很多例子,其中一个典型的例子是使用 XxxService/XxxRepository 作为例子。但是在我看来,按照UML的概念,类XxxRepositor
我开始使用 Google Guice。 我有一个简单的问题: javax.inject 的 @Inject 注释和 com.google.inject 的 有什么区别@Inject 一个 ? 谢谢。
当使用构造函数注入(inject)工厂方法时,依赖的属性不会得到解析。但是,如果在解析依赖的组件之前解析了工厂方法,则一切都会按预期工作。此外,当仅使用属性注入(inject)或构造函数注入(inje
我有这样的事情: class Root { public Root(IDependency dep) {} } class Dependency:IDependency { p
听完Clean Code Talks ,我开始明白我们应该使用工厂来组合对象。因此,例如,如果 House有一个 Door和 Door有一个 DoorKnob , 在 HouseFactory我们创建
情况:我需要在一些 FooClass 中进行惰性依赖实例化,所以我通过 Injector类作为构造函数参数。 private final Injector m_injector; public Foo
在编写代码时,我们应该能够识别两大类对象: 注入(inject)剂 新品 http://www.loosecouplings.com/2011/01/how-to-write-testable-cod
这个问题是关于 Unity Container 的,但我想它适用于任何依赖容器。 我有两个具有循环依赖关系的类: class FirstClass { [Dependency] pub
如果我有 10 个依赖项我需要注入(inject)并且不想在构造函数中有 10 个参数,我应该使用哪种注入(inject)模式? public class SomeClass { privat
我在使用 Angular2 DI 时遇到了问题。我尝试将一个类注入(inject)另一个类,它引发了以下错误: 留言:"Cannot resolve all parameters for 'Produ
对依赖注入(inject)还很陌生,我想弄清楚这是否是一种反模式。 假设我有 3 个程序集: Foo.Shared - this has all the interfaces Foo.Users -
我正在尝试了解 Angular 14 的变化,尤其是 inject()我可以将模块注入(inject)功能的功能,我不需要为此创建特殊服务..但我想我弄错了。 我正在尝试创建一些静态函数来使用包 ng
希望这个问题不是太愚蠢,我试图掌握更高级的编程原理,因此试图习惯使用 Ninject 进行依赖注入(inject)。 因此,我的模型分为几个不同的 .dll 项目。一个项目定义了模型规范(接口(int
我最近一直在大量使用依赖注入(inject)、测试驱动开发和单元测试,并且开始喜欢上它。 我在类中使用构造函数依赖,这样我就可以为单元测试注入(inject)模拟依赖。 但是,当您实际需要生产环境中的
我有下面的代码来使用 Guice 进行依赖注入(inject)。第一个是使用构造函数注入(inject),而另一个是直接在字段上方添加 @Inject。这两种方式有什么区别吗? Guice官网似乎推荐
这个问题在这里已经有了答案: Angular2 Beta dependency injection (3 个答案) 关闭 7 年前。 我正在使用 angular2 测试版。并在使用 @Inject
有没有可能做这样的事情? (因为我尝试过,但没有成功): @Injectable() class A { constructor(private http: Http){ // <-- Injec
我很恼火必须通过 Constructor 传递管道对象,因为我想为业务实体或要传递的值保留构造函数参数。 所以我想通过 setter ,但只要这些 setter 没有被填充,我的包含依赖项的对象就不应
假设我有这个: SomePage.razor: @inject Something something @page "/somepage" My Page @code { // Using
我是一名优秀的程序员,十分优秀!