rxjs订阅onerror绑定

时间:2017-04-30 06:12:15

标签: javascript angular rxjs

我使用angular2 / rxjs并且很难理解.subscribe()的onerror回调的有用性。我见过的每个例子都只是打印到控制台,但是,如果我想做其他事情,比如让其他服务处理错误怎么办?简单地调用this.otherservice.handleError并不能正确绑定this。所以我需要像this.otherservice.handleError.bind(this.otherservice)一样调用它。这是预期还是我错过了什么?

@Injectable
export class OtherService {
    public foo: Subject<string>;
    constructor() {
        this.foo = new Subject<string>();
    }
    handleError(error: any) {
        this.foo.next(error);
    }
}


@Injectable
export class MyService {
    constructor(private http: Http, private otherservice: OtherService) {}
    get() {
        this.http.get('www.foo.com').subscribe(
            () => 'success',
            this.otherservice.handleError
        )
    }
}

谢谢

2 个答案:

答案 0 :(得分:2)

基本上,当您将闭包放入订阅时,它会转换为此形式:

observer = {
  next: onNextFn,
  error: onErrorFn,
  complete: onCompleteFn
}

所以当你把:

 .subscribe(
    () => 'success',
    this.otherservice.handleError
 )

这意味着:

{
  next: () => 'success',
  error: this.otherservice.handleError
}

所以this上下文将是observer个对象。你需要绑定上下文来维护这些函数的正确上下文。

答案 1 :(得分:-1)

您的错误方法需要一个您未定义的参数

get() {
    this.http.get('www.foo.com').subscribe(
        (data => 'success'}), 
    (error) => {
        this.otherservice.handleError
    )
}