Javascript 订阅后的角度2数组有元素,但长度为0
我正在使用Angular 2,我注意到了一个意外的行为 我有一个datasource类,它扩展了datasource,有两个变量:Javascript 订阅后的角度2数组有元素,但长度为0,javascript,angular,typescript,rxjs,observable,Javascript,Angular,Typescript,Rxjs,Observable,我正在使用Angular 2,我注意到了一个意外的行为 我有一个datasource类,它扩展了datasource,有两个变量: private archives = new BehaviorSubject<MyArchive[]>([]); public archives$: Observable<MyArchive[]> = this.archives.asObservable(); private filteredArchive: MyArchive[]; 在另
private archives = new BehaviorSubject<MyArchive[]>([]);
public archives$: Observable<MyArchive[]> = this.archives.asObservable();
private filteredArchive: MyArchive[];
在另一个类中,我尝试订阅可观察的,但它不起作用:
ngAfterViewInit(): void {
this.dataSource.archives$.subscribe((archive: Array<MyArchive>) => {
console.log(archive.length);
console.log(archive);
console.log(archive.length);
}
}
ngAfterViewInit():void{
this.dataSource.archives$.subscribe((归档:数组)=>{
console.log(archive.length);
console.log(归档);
console.log(archive.length);
}
}
在控制台日志中打印:
0
<THE ARCHIVE WITH AN OBJECT INSIDE AS IT SHOULD BE, WITH LENGTH = 1>
0
0
0
因此,我无法迭代存档变量,因为它的长度为0。这是怎么回事?我不知道您为什么要冗余创建
存档$
和存档
。您只需一个行为子对象即可
我认为你应该这样做:
// Create a BehaviorSubject for MyArchive[]
public archives$: BehaviorSubject<MyArchive[]> = new BehaviorSubject<MyArchive[]>([]);
// Create a private filtered Array for MyArchive.
private filteredArchive: MyArchive[];
我不知道你为什么要冗余地创建
归档$
和归档
。你只需要一个行为主体就可以做到
我认为你应该这样做:
// Create a BehaviorSubject for MyArchive[]
public archives$: BehaviorSubject<MyArchive[]> = new BehaviorSubject<MyArchive[]>([]);
// Create a private filtered Array for MyArchive.
private filteredArchive: MyArchive[];
问题是,该值在订阅之前就已经发出了。想想像电视流这样的可观测数据,如果在节目结束后打开电视(在推送数据后订阅),则数据就像这个流上的一个节目,您永远看不到该节目。如果您希望可观测数据保留最后一个值,则可以像这样使用扫描操作符:
export const reducer = () =>
scan<MyArchive[]>((archive, update) => {
//update your Archive or simply overwrite the value
archive = update
return archive
}, []);
export class datasource {
archives$ : Observable<MyArchive[]>;
archives : Subject<MyArchive[]> = new Subject([]);
update(newMyArchive: MyArchive[]) {
this.archives.next(newMyArchive);
}
constructor(public http: HttpClient) {
this.archives$ = this.archives.pipe(
reducer(),
//use the shareReplay so all your subscribers get the same values
shareReplay(1)
);
this.archives$.subscribe();
}
问题是,该值在订阅之前就已经发出了。想想像电视流这样的可观测数据,如果在节目结束后打开电视(在推送数据后订阅),则数据就像这个流上的一个节目,您永远看不到该节目。如果您希望可观测数据保留最后一个值,则可以像这样使用扫描操作符:
export const reducer = () =>
scan<MyArchive[]>((archive, update) => {
//update your Archive or simply overwrite the value
archive = update
return archive
}, []);
export class datasource {
archives$ : Observable<MyArchive[]>;
archives : Subject<MyArchive[]> = new Subject([]);
update(newMyArchive: MyArchive[]) {
this.archives.next(newMyArchive);
}
constructor(public http: HttpClient) {
this.archives$ = this.archives.pipe(
reducer(),
//use the shareReplay so all your subscribers get the same values
shareReplay(1)
);
this.archives$.subscribe();
}
使用此语句时:
console.log(archive);
控制台中显示了对archive
对象的引用(请参阅)。在控制台中检查对象时(通过单击箭头),对象的内容可能与执行console.log
语句时不同
为了查看特定时刻的实际内容,您应该输出对象的字符串表示形式:
console.log(archive.toString());
console.log(JSON.stringify(archive));
使用此语句时,您可以体验以查看各种控制台输出。:
console.log(archive);
控制台中显示了对archive
对象的引用(请参阅)。在控制台中检查对象时(通过单击箭头),对象的内容可能与执行console.log
语句时不同
为了查看特定时刻的实际内容,您应该输出对象的字符串表示形式:
console.log(archive.toString());
console.log(JSON.stringify(archive));
您可以通过体验查看各种控制台输出。我解决了这个问题。
我忘了此.filteredArchive已由HTTP GET请求更新。我试图使用forEach推送此.filteredArchive中的数据,但我忘了在收到所有数据时调用then()。
因此,我尝试使用subscribe访问一个尚未准备好的结果
谢谢大家的回复!我解决了这个问题。
我忘了此.filteredArchive已由HTTP GET请求更新。我试图使用forEach推送此.filteredArchive中的数据,但我忘了在收到所有数据时调用then()。
因此,我尝试使用subscribe访问一个尚未准备好的结果
感谢大家的回复!对于第二个
console.log
语句,请尝试:console.log(archive.toString())
或console.log(JSON.stringify(archive))
。您可能会看到数组是空的。不确定为什么要冗余创建公共存档$:Observable=this.archives.asObservable()
当您已经有私有存档=新的行为子对象([]);
您确定过滤器数据库
不是空的吗?@ConnorsFan我试过了,是的,数组是空的。这意味着当我做console.log(存档)时,我正在打印对象的实时值。那是什么错误?我的意思是,我试图在订阅之后更新observable,当我确定订阅方法被调用时。@Siddhartajmera我是作为一种模式来做的。observable应该是可读的,以便我将其声明为公共的,而不是行为主体是writeable是私有的,只有它的类才能更新它。我遵循了这个官方指南:对于第二个console.log
语句,请尝试:console.log(archive.toString())
或console.log(JSON.stringify(archive))
。您可能会看到数组是空的。不确定为什么要冗余创建公共存档$:Observable=this.archives.asObservable();
当您已经有私有存档=新行为子对象([])时
你确定filteredArchive
不是空的吗?@ConnorsFan我试过了,是的,数组是空的。这意味着当我执行console.log(归档)时,我正在打印对象的实时值。那是什么错误?我的意思是,我试图在订阅之后更新observable,当我确定订阅方法被调用时。@Siddhartajmera我是作为一种模式来做的。observable应该是可读的,以便我将其声明为公共的,而不是行为主体是writeable是私有的,只有它的类才能更新它。我遵循了这个官方指南:谢谢你的回复。至少现在我知道如何正确地检查subscribe方法给出的结果是否有效。谢谢你的回复。至少现在我知道如何正确地检查subscribe方法给出的结果是否有效d或否。我不确定this.actions和this.state变量的含义。但是,我尝试在调用订阅方法后推送数据。问题仍然存在。状态应为archives$,而action应为archives@Davide我确实在stackblitz工作中输入了代码,希望这能有所帮助。我不知道是什么