Angular2可观察与承诺

时间:2016-08-22 14:08:42

标签: angular angular2-observables

我目前正在开发一个Web应用程序,它必须从SQL数据库(如某些员工或工作计划)加载一组数据。每次当您被路由到组件时,如果您更新数据,它将被发送到服务器并返回某种成功或错误消息。

目前我使用的是可观察物,但它们的表现并不像我想要的那样。我订阅了一个observable,接收我的数据并取消订阅(我也不知道在哪里取消订阅。在onDestroy或我的sub的Complete部分?)。但不知何故,它仍然是异步的,因为在接收导致我的应用程序失败的所有数据之前代码执行仍在继续。

以下是我的实施示例:

员工组件:

getEmployees(department: any){

this.employeesSub = this.employeeManagementService.getEmployees(department).subscribe(
          //Sucess
          data => {this.employees = data},
          //Error
          err => this.logger.error(err),
          //Complete
          () => {this.logger.log('done loading');
                }
    );
}
  ngOnInit(){

    this.selectedDepartment = this.ccs.getSelectedDepartment();
    //Does the same type of request as getEmployees()
    this.getDepartments();
    this.paramSub = this.route.params.subscribe(
        //Success    
        params => {    
            //doStuff
            }
        },
        //Error
        err => this.logger.error(err),
        //Complete
        () => {}
    );
}
  ngOnDestroy(){
      this.employeesSub.unsubscribe();
      this.paramSub.unsubscribe();
  }

员工服务:

getEmployees(department: string): Observable<Employee[]>{
    let method = "getEmployees";
    let body = JSON.stringify({method, department});
    this.logger.log(body);
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });

    return this.http.post(this.url, body, options)
                    .map((res:Response) =>{ 
                            this.logger.log(res.json());
                            return res.json();
                    }).catch(this.handleError);
}

我知道这可能经常被问到这里。但即使我阅读了越来越多的帖子,我仍然不确定这种差异。有人可能需要一些时间来帮助我吗?

3 个答案:

答案 0 :(得分:3)

取消订阅有点多余,因为this._http.xxx()返回的observable在第一个事件后关闭,导致订阅无论如何都会被取消。

为确保您可以使用this._http.xxx().first().subscribe(...)。这样,无论发件人打算发出多少事件,订阅都会在第一个事件后关闭。

代码执行继续而不等待响应是异步执行的本质,使用promise或者observable非常相似。

如果您希望在数据到达后执行代码,则必须将该代码移至subscribe(...)map(...)或其他一些可观察的运算符。

答案 1 :(得分:0)

促销活动:
  一次只发出一个值。
  呼叫服务,然后捕获
。   无法取消。
  不提供任何运算符。

可观察:
   在一段时间内发出多个值。
   在我们订阅可观察的
之前,它不会被调用    提供地图,以便每次,过滤,减少,重试和何时重试。
   它们是稍后要订阅的功能
   懒惰

答案 2 :(得分:0)

看看这篇文章:https://scholarbasta.com/promises-vs-observables/

承诺在以下情况下使用,

  1. 活动一次性完成。
  2. 事件只发出一个值,
  3. 您真的不需要退订此活动。

在以下情况下使用 observable:

  1. 您需要取消订阅此活动,
  2. 正在发出多个流,您需要对它们执行各种操作。
  3. 假设您需要过滤/映射一些值。 Rxjs 库在这方面非常强大。
  4. 有多个值来自同一来源。