2017-07-30 45 views
-1

如何检查服务是否已完成,然后运行代码的其余部分?
例如:
我想从API的一些数据是这样的:角度2检查服务是否完成

get_user_info(token: string): Observable<any> { 
    return this.http.get(this.home + 'api/home/account/excerpt?token=' + token) 
    .map((response: Response) => { 
     return response.json().result; 
    }); 
} 

,我想从get_user_info订阅数据:

retrieve_user_info() { 
    this.http.get_user_info(this.back_result.token).subscribe(
     (result: sendBackUserInfo) => { 
      if (result.result == 1) { 
       this.user_info = result.user; 
      } else { 
       console.log(result.messages[0]); 
      } 
     } 
    ); 
} 

但问题是,当我打电话函数retrieve_user_info,它不立即获取数据。
我该如何解决这个问题?

编辑:
我这是怎么叫retrieve_user_info

submit_login_form() { 
this.http.login_user(this.username, this.password, this.result.language.code) 
    .subscribe((result: loginSendBackResult) => { 
     this.back_result = result; 
     this.retrieve_user_info(); 
     if (this.back_result.result == 1) { 
      this.show_modal = false; 
      console.log(user_info); 
      router.navigate(['home']); 
     } 
    }); 
} 
+0

你不能 “解决这个问题”,这是异步的。无论你需要做什么你的数据,你需要在回调内做到这一点:) – Alex

+0

请显示您实际使用该数据的代码。你把它作为'@Input()'发送给某个组件,或者你对它做了什么? –

+0

@deezg问题已更新 – amirsa00

回答

0

这是不是JS的问题。您的服务器响应速度比您需要的慢。你想要这个数据在哪里?在模板或其他功能。如果您希望在模板中使用它,您可以使用一个名为ngOnInit()的函数捕获它,该函数可以在组件类中声明。

@Component({selector: 'my-cmp', template: `...`}) 
class MyComponent implements OnInit { 
    ngOnInit() { 
    // ... 
    } 
} 

https://angular.io/api/core/OnInit

如果其一种不同的方法。请详细说明您如何以及在哪里调用http请求,以及为什么您需要立即。

retrieve_user_info() { 
    this.http.get_user_info(this.back_result.token).subscribe(
     (result: sendBackUserInfo) => { 
      // Get both data in one request 
      // Better your REST API 
      // Do your checks with the dependent data 
      // If dependent data right then change the router guard 
      // https://angular.io/api/router/CanDeactivate 
      // Route the person using router 
      // https://angular.io/api/router/Router 
     } 
    ); 
} 
+0

点击按钮后我想获取数据!此外,该按钮是登录一个用户,但我需要一些额外的数据从服务器在用户登录过程完成之前!我希望我能清楚地解释我的目的 – amirsa00

+0

我还是不明白。你为什么触发两个请求? – Gary

+0

使用编辑后的逻辑。我不知道你需要什么额外的数据,它应该是什么。你必须详细说明你是不可理解的 – Gary

0

您可能使用:

subscribe(next?: (value: T) => void, 
      error?: (error: any) => void, 
      complete?:() => void): Subscription; 

将只在next?已成功完成,因此可以确保数据已恢复执行complete?部分。

+1

你不需要,也可能不想,直到观察结束。您只需等待直到下一个回调被调用。 – 2017-07-30 10:00:18

1

您可以使用flatMap来链接您的请求。你的命名也让我有点困惑。在提及服务方法时,我会将服务命名为service而不是http,以分隔我们发出http请求的位置以及我们在服务中调用方法的位置。所以我在这些地方使用了service

import "rxjs/add/operator/mergeMap"; 
submit_login_form() { 
    this.service.login_user(...) 
    .flatMap((result: loginSendBackResult) => { 
     this.back_result = result; 
     return this.retrieve_user_info(); 
    }); 
    .subscribe(data => { 
     if(this.back_result.result == 1) { 
      console.log(this.user_info) 
      .... 
     } 
    }) 
} 

和你retrieve_user_info()

retrieve_user_info() { 
    return this.service.get_user_info(this.back_result.token) 
    .map((result: sendBackUserInfo) => { 
     if (result.result == 1) { 
      return this.user_info = result.user; 
     } else { 
      console.log(result.messages[0]); 
     } 
    }); 
} 
+0

一个小小的演示...... http://plnkr.co/edit/FTDqGndQlbqJ8pUtRyWZ – Alex

+0

你也可以考虑将所有“不必要的逻辑”从组件中移除到服务上:) – Alex