Javascript 角度2回调

Javascript 角度2回调,javascript,angular,Javascript,Angular,我创建了一个从api获取数据的服务,这是代码 getChallenges(): Observable<IChallenge[]> { if (this._challengeUrl != null) { return this.http.get(this._challengeUrl) .map((res:Response) => <IChallenge[]>res.json()) .do(data

我创建了一个从api获取数据的服务,这是代码

getChallenges(): Observable<IChallenge[]> {
    if (this._challengeUrl != null) {
        return this.http.get(this._challengeUrl)
            .map((res:Response) => <IChallenge[]>res.json())
            .do(data => console.log('data: ' + JSON.stringify(data)))
            .catch(this.handleError);
    } else {
        //;
    }
}
我的问题是,当我尝试将函数放在subscribe代码之后时,我总是得到一个空数组,因为ngOnInit首先运行这个函数,然后获取数据。我怎样才能逆转这个?我需要获取数据,然后运行此函数。
那么,有什么办法可以做到这一点吗?谢谢

一种方法是在检索数据时直接过滤,例如:

this._challengeService.getChallenges()
        .subscribe(challenges => this.challenges = challenges.filter((obj)=> obj.level == lvl),
                    error => this.errorMessage = <any>error);
this.\u challengeService.getChallenges()
.subscribe(challenges=>this.challenges=challenges.filter((obj)=>obj.level==lvl),
error=>this.errorMessage=error);

注意lvl将是未定义的,因此您必须用您的逻辑以某种方式定义它

一种方法是在检索数据时直接过滤,例如:

this._challengeService.getChallenges()
        .subscribe(challenges => this.challenges = challenges.filter((obj)=> obj.level == lvl),
                    error => this.errorMessage = <any>error);
this.\u challengeService.getChallenges()
.subscribe(challenges=>this.challenges=challenges.filter((obj)=>obj.level==lvl),
error=>this.errorMessage=error);
注意lvl将是未定义的,因此您必须用您的逻辑以某种方式定义它

我还没有尝试过(在工作时无法访问angular2:-(),但是您可以在
subscribe
中的lambda函数中有多个语句

this._challengeService.getChallenges()
        .subscribe(challenges =>   
                     { 
                       this.challenges = challenges; 
                       filterByLvl(expert_level); 
                     },
                    error => this.errorMessage = <any>error
                   );
this.\u challengeService.getChallenges()
.订阅(挑战=>
{ 
这就是挑战;
filterByLvl(专家级);
},
error=>this.errorMessage=错误
);
我还没有尝试过(在工作时无法访问angular2:-(),但您可以在
subscribe
中的lambda函数中使用多个语句

this._challengeService.getChallenges()
        .subscribe(challenges =>   
                     { 
                       this.challenges = challenges; 
                       filterByLvl(expert_level); 
                     },
                    error => this.errorMessage = <any>error
                   );
this.\u challengeService.getChallenges()
.订阅(挑战=>
{ 
这就是挑战;
filterByLvl(专家级);
},
error=>this.errorMessage=错误
);

您好,谢谢您的回复现在它将只过滤并返回过滤后的数据,这对我来说不起作用,因为我希望它首先获取原始数据,然后过滤挑战数组为什么不添加另一个参数
过滤挑战
并执行
挑战=>此操作。挑战=挑战,过滤挑战=>此操作s、 筛选=挑战。筛选((obj)=>obj.level==lvl)
是的。这对我来说不太好,因为我正在访问此挑战数组,以便根据他们的级别获取所有“挑战”。我最初有一个按钮来设置级别,但有人告诉我,我需要将应用程序加载为默认的简单问题。我真的不想添加新的数组或任何东西,因为只需一个按钮即可问题是,当我想在Ngoniniti之后加载时,感谢您的回复,现在它将过滤并仅返回过滤后的数据,这对我不起作用,因为我希望它首先获取原始数据,然后过滤挑战数组为什么不添加另一个参数
过滤挑战
并执行
挑战=>this.challenges=challenges,filteredchallenges=>this.filtered=challenges.filter((obj)=>obj.level==lvl)
是的。这对我来说不太好,因为我正在访问此挑战数组,以便根据他们的级别获取所有“挑战”。我最初有一个按钮来设置级别,但有人告诉我,我需要将应用程序加载为默认的简单问题。我真的不想添加新的数组或任何东西,因为只需一个按钮即可问题是当我想在Ngoninit之后加载时,你把过滤后的数据放在哪里?在这个例子中,你把过滤后的数据扔掉了。天哪,你说得对,就像凌晨4点,我试图解决它,而我的大脑几乎死了:).哈哈,我喂得太傻了,但是,你把过滤后的数据放在哪里了?在这个例子中,你把过滤后的数据扔掉了。天哪,你说得对,就像凌晨4点,我试图解决这个问题,而我的大脑几乎死了:)。哈哈,我喂得太蠢了,谢谢你,这是我想要的,它能工作,正如你提到的,我没有存储我的过滤数据:)。真的非常感谢您的帮助谢谢这是我想要的。它可以正常工作,正如您提到的,我没有存储过滤后的数据:)。真的谢谢你的帮助