Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.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
Javascript 订阅后的角度2数组有元素,但长度为0_Javascript_Angular_Typescript_Rxjs_Observable - Fatal编程技术网

Javascript 订阅后的角度2数组有元素,但长度为0

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[]; 在另

我正在使用Angular 2,我注意到了一个意外的行为

我有一个datasource类,它扩展了datasource,有两个变量:

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工作中输入了代码,希望这能有所帮助。我不知道是什么