rxjs:我怎样才能做到;从「;订阅后的可观察发射值?

rxjs:我怎样才能做到;从「;订阅后的可观察发射值?,rxjs,Rxjs,我已经创建了一个普通字符串数组,并使用“from”从中提取了一个可观察的 如果我在订阅之前将一个值推送到原始数组,我会在数据流中得到该值 strArr.push("coke") fsa.subscribe( x=>console.log(x) // outputs -> aaaa bbbb cccc coke ) 但是,如果我在订阅之前将另一个元素推送到原始数组,则不会发生任何事情(它不会做出反应) 我希望fsa Observable能够对添加到原始数组中的每个元素做出反应,

我已经创建了一个普通字符串数组,并使用“from”从中提取了一个可观察的

如果我在订阅之前将一个值推送到原始数组,我会在数据流中得到该值

strArr.push("coke")

fsa.subscribe(
  x=>console.log(x) // outputs -> aaaa bbbb cccc coke
)
但是,如果我在订阅之前将另一个元素推送到原始数组,则不会发生任何事情(它不会做出反应)

我希望fsa Observable能够对添加到原始数组中的每个元素做出反应,因为它是“从”这个元素创建的

为什么会导致这种行为


谢谢。

使用数组并不容易,但可以使用主题代替数组

问题是:您需要创建一个数组,还是可以使用主题来代替

const stream$=新的ReplaySubject();
流$.next('aaa');
流$.next('bbb');
流$.next('ccc');
流$.subscribe(console.log);//[aaa bbb ccc]
流$.next('ddd');
流$.subscribe(console.log);//[aaa bbb ccc ddd],第一次订阅只获得“ddd”。

如果您想监听数组中的changed,最好的方法是编写一个自己的observate,覆盖push方法并发送到流中。如果需要,请告诉我,我可以更新代码示例。

使用数组并不容易,但可以使用主题代替数组

问题是:您需要创建一个数组,还是可以使用主题来代替

const stream$=新的ReplaySubject();
流$.next('aaa');
流$.next('bbb');
流$.next('ccc');
流$.subscribe(console.log);//[aaa bbb ccc]
流$.next('ddd');
流$.subscribe(console.log);//[aaa bbb ccc ddd],第一次订阅只获得“ddd”。

如果您想监听数组中的changed,最好的方法是编写一个自己的observate,覆盖push方法并发送到流中。如果您需要,请告诉我,我可以更新代码示例。

另一种选择是将
BehaviorSubject
与javascript
Proxy
相结合,以查看数组中的每种类型的更改

import {BehaviorSubject,Subject} from 'rxjs'
var originalArray = [];
const arrayChange=new BehaviorSubject(originalArray)
arrayChange.subscribe(console.log)

var arrayChangeHandler = {
  set: function(target, property, value, receiver) {
    console.log('setting ' + property + ' for ' + target + ' with value ' + value);
    target[property] = value;
    // you can emit more context to the stream if you wish
    arrayChange.next(target)
    // you have to return true to accept the changes
    return true;
  }
};

var arrayProxy = new Proxy( originalArray, arrayChangeHandler );
arrayProxy.push(1)
arrayProxy.push(2)
arrayProxy.pop()

另一种选择是将
BehaviorSubject
与javascript
Proxy
相结合,以监视数组中的每种类型的更改

import {BehaviorSubject,Subject} from 'rxjs'
var originalArray = [];
const arrayChange=new BehaviorSubject(originalArray)
arrayChange.subscribe(console.log)

var arrayChangeHandler = {
  set: function(target, property, value, receiver) {
    console.log('setting ' + property + ' for ' + target + ' with value ' + value);
    target[property] = value;
    // you can emit more context to the stream if you wish
    arrayChange.next(target)
    // you have to return true to accept the changes
    return true;
  }
};

var arrayProxy = new Proxy( originalArray, arrayChangeHandler );
arrayProxy.push(1)
arrayProxy.push(2)
arrayProxy.pop()

我找到了一个解决办法。(让观察家对订阅后阵列的进一步变化做出反应,我希望它能帮助那些有类似问题的人:

import { ReplaySubject } from 'rxjs';

const rSubject$ = new ReplaySubject();

const rSubjAsObs = rSubject$.asObservable();

// string
const str =  "I am afraid I can not do that, Dave";
//string no spaces
let strNoSpace = str.replace(/\s+/g, ''); 
//word array
let srtArr = str.split(' ');

srtArr.forEach(word=>rSubject$.next(word))

rSubjAsObs.subscribe(
  data=>console.log(data)
)

rSubject$.next("...said the good machine");

我找到了一个解决方案来解决我正在尝试做的事情。(让观测者在订阅后对阵列中的进一步更改做出反应,我希望它能帮助那些有类似问题的人:

import { ReplaySubject } from 'rxjs';

const rSubject$ = new ReplaySubject();

const rSubjAsObs = rSubject$.asObservable();

// string
const str =  "I am afraid I can not do that, Dave";
//string no spaces
let strNoSpace = str.replace(/\s+/g, ''); 
//word array
let srtArr = str.split(' ');

srtArr.forEach(word=>rSubject$.next(word))

rSubjAsObs.subscribe(
  data=>console.log(data)
)

rSubject$.next("...said the good machine");

from
仅发射阵列中的项目,不会为任何阵列对象操作发射我看到了…但是,如果我再次在下面
strArr.push(“pepsi”)
写入订阅代码,我会看到打印出的所需结果(“aaaa BBBBB cccc可口可乐pepsi”)。还有一个数组修改。那是因为from仍然引用同一个数组,这就是为什么你会得到更新的结果。数组存储为指向JS中数组对象的指针。谢谢你的时间。你能用Rsjx重新给我推荐另一个或方法吗?这样我就可以研究它来实现我正在尝试的功能了?(我只是在学习Rxjs)。我不想让这项工作为我完成,只是一个提示……谢谢你,老兄。我会添加一个答案,建议另一种方法
,从
只发射数组中的项目,不会发射任何数组对象操作。我看到了……但是,如果我再次编写下面的订阅代码
strArr.push(“pepsi”)
,我看到了打印出来的预期结果(“aaaa bbbb cccc可口可乐-百事可乐”)。还有一个数组修改。那是因为from仍然引用同一个数组,这就是为什么你会得到更新的结果。数组存储为指向JS中数组对象的指针。谢谢你的时间。你能用Rsjx重新给我推荐另一个或方法吗?这样我就可以研究它来实现我正在尝试的功能了?(我只是在学习Rxjs)。我不想让这项工作为我完成,只是一个提示……谢谢你,伙计。我会添加一个答案,建议另一种方法。我想要的是避免在下一个值之后再次订阅。我曾这样想:const strArr=['aaa',“bbb”,“ccc”];const fsa=from(strArr);strArr.push(“可口可乐”);fsa.subscribe(x=>console.log(x));strArr.push(“可口可乐”);/*打印到“可口可乐”/fsa.subscribe(x=>console.log(x));strArr.push(“百事可乐”);fsa.subscribe(x=>console.log(x))/打印所有内容*/但代码块与您的代码块相似,我的意思是我将再次订阅。请您向我提供更新信息好吗?非常感谢您,老兄。很抱歉,我不知道如何将代码粘贴到注释中以使其清晰和缩进。:(您不需要第二次订阅。这是一个示例。一次
。下一次('ddd')
被称为第一次订阅将获得
ddd
。我想要的是避免在下一个值之后再次订阅。我曾这样想:const strArr=['aaa',“bbb”,“ccc”];const fsa=from(strArr);strArr.push(“coke”);fsa.subscribe(x=>console.log(x));strArr.push(“coke”);/*打印到“coke”/fsa.subscribe(x=>console.log(x));strArr.push(“百事”);fsa.subscribe(x=>console.log(x))/打印所有内容*/但代码块与您的代码块相似,我的意思是我将再次订阅。请您向我提供更新信息好吗?非常感谢您,老兄。很抱歉,我不知道如何将代码粘贴到注释中以使其清晰和缩进。:(您不需要第二次订阅。这是一个示例。一次
。下一次('ddd')
被称为第一个订阅将获得
ddd