Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rxjs 使用subscription.next()是否为反模式?_Rxjs_Rxjs5 - Fatal编程技术网

Rxjs 使用subscription.next()是否为反模式?

Rxjs 使用subscription.next()是否为反模式?,rxjs,rxjs5,Rxjs,Rxjs5,我有一个订阅,我想用它在一段中间件代码中发出事件信号。所以我有一件事想要订阅一个可观测的,另一件事不完全是可观测的 我想用主题来做这件事——这就是他们的目的: const repeater = new Rx.Subject(); function subscribe(observer) { return repeater.subscribe(observer); } // in some other function, call repeater.next(val) 但后来我开始研究常

我有一个订阅,我想用它在一段中间件代码中发出事件信号。所以我有一件事想要订阅一个可观测的,另一件事不完全是可观测的

我想用主题来做这件事——这就是他们的目的:

const repeater = new Rx.Subject();

function subscribe(observer) {
  return repeater.subscribe(observer);
}

// in some other function, call repeater.next(val)
但后来我开始研究常规subscribe()调用返回的内容。我可以这样做:

let sub = null;
function subscribe(observer) {
  return Rx.Observable.create((o) => sub = o);
}
// elsewhere sub.next(val)
而且呢

let unsub = null;
function subscribe(observer) {
  unsub = Rx.Observable.create(() => false).subscribe(observer)
}
// elsewhere unsub.next(val)
所有这些都将向订户发送val信号。这里我不明白的一件奇怪的事情是订阅返回有一个
next()
可供使用-我认为
next()
只存在于可观察上下文中的观察者上

无论发生什么,我都需要对取消订阅doodad保持一个句柄——当中间件被拆除时,我需要发出流完成信号并释放一些资源。令我惊讶的是,不明嫌犯有一个正常运作的下一个


这向我发出了一个信号,有一些RXJ,我只是简单地说,在观察者、被观察者和主体等方面,我还没有摸索过。一般来说,我了解如何将事件源和其他类似的东西连接到一个可观察的流中。实际上,这只是在从一个无聊的函数调用中构建一个可观察流的上下文中——每当外部库调用该函数时,该流都会发出一个更新的可观察流的信号。

订阅者扩展订阅和观察者,添加状态。它公开了一种更改状态的方法(即,
unsubscribe()
),以及 它还公开了观察者的
next()
/
error()
/
complete()
方法, 但这些方法现在既尊重国家,也改变国家

所以,如果我给你一个简单的观察者,你可以调用
next()
/
error()
/
complete()
按任何顺序,按你想要的次数,即使是 在调用my
complete()
之后调用my
next()
对您来说太糟糕了

另一方面,如果我给你一个裹在 订户,现在有状态了,如果您尝试调用
next()
on 在你调用
complete()
之后,我就看不到它了。 如果您调用
unsubscribe()
,我将被分离

当您呼叫subscribe时,如

subscriber = Rx.Observable.create(fn).subscribe(observer);
你得到的是同一个观察者,只有那个观察者, 包装在订户中。这就是为什么您会看到
next()
/
error()
/
complete()
方法。但这些方法通常是供内部使用的,如果您使用它们为观察者提供信息,它将无法实现您的预期:

let observerA = {
    next: (x) => console.log('A: value: ' + x),
    error: (x) => console.log('A: error: ' + x),
    complete: () => console.log('A: completed')
}
let observerB = {
    next: (x) => console.log('B: value: ' + x),
    error: (x) => console.log('B: error: ' + x),
    complete: () => console.log('B: completed')
}

let observable = Rx.Observable.create(() => false);
let subscriberA = observable.subscribe(observerA);
let subscriberB = observable.map(x => 10*x).subscribe(observerB);
subscriberA.next(1); // only feeds observerA
// => "A: value: 1"
subscriberB.next(2); // only feeds observerB
// => "B: value: 2"  // What?
可能性是,对于您的用例,您将

  • 想使用Subject,因为它提供了
    next()
    /
    error()
    /
    complete()
    接口,让您可以为操作员链的前端提供反馈
  • 想要使用Subject,因为它允许您向多个观察者提供相同的值
  • 忘记您刚刚了解的订阅者信息,因为您不会使用订阅者界面的
    next()
    /
    error()
    /
    complete()。相反,将
    subscribe()
    返回的对象视为仅订阅,并且仅对其使用
    unsubscribe()
    方法
  • 因此:


    另请参见。

    Aha!下一步(2);//=>“B:value:2”
    零件确实固化了它。现在这很有道理。真棒的回答。
    let subject = new Rx.Subject();
    let subscriptionA = subject.subscribe(observerA);
    let subscriptionB = subject.map(x=>10*x).subscribe(observerB);
    subject.next(3);
    // => A: value: 3
    // => B: value: 30
    subscriptionA.unsubscribe()
    subject.next(4);
    // => B: value: 40
    subscriptionB.unsubscribe()
    subject.next(5);
    // (no output)