1

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

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

这是我的实现示例:

员工组件:

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);
}

我知道这可能在这里经常被问到。但是我真的不确定差异,即使我阅读越来越多的帖子我也不会明白。有人可以花点时间帮助我吗?

4

3 回答 3

3

取消订阅有点多余,因为从this._http.xxx()第一个事件之后返回的可观察对象关闭,这导致订阅无论如何都会被取消。

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

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

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

于 2016-08-22T14:14:49.797 回答
0

Promises:
在 time 只发出一个值。
在没有 then 和 catch 的情况下调用服务。
无法取消。
不提供任何运算符。

Observable :
在一段时间内发出多个值。
直到我们订阅了 observable 才会调用它,
提供 map、forEach、filter、reduce、retry 和 retry when。
它们是稍后在
Lazy上订阅的功能

于 2019-11-12T18:12:13.290 回答
0

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

承诺在以下情况下使用,

  1. 活动一气呵成。
  2. 该事件仅发出一个值,
  3. 你真的不需要取消订阅这个事件。

在以下情况下使用可观察对象:

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