调用取消订阅时 Observable 为空
Observable is null when unsubscribe is called
我正在尝试 return 一个将 return 数据如下的可观察对象。
getRootGroupNodes(): Observable<Group[]> {
return Observable.create(function(observer) {
var groups = [
{ groupName: "Group1" },
{ groupName: "Group2" }
]
observer.next(groups);
observer.complete();
});
}
当我尝试食用它时
this._loadGroupsSubscription = this._apiGroupService.getRootGroupNodes()
.retry(3)
.subscribe(
groups => {
// do somethign with groups
},
err => { this._log.logMessage("failed to retrieve groups"); },
() => {
this._loadGroupsSubscription.unsubscribe();
}
);
我得到 this._loadGroupsSubscription
是 null
。因此抛出异常试图调用未定义的取消订阅。任何想法我做错了什么?这应该是基本的..
确实没有在回调中分配变量。我认为有两种方法可以解决这个问题:
用setTimeout()
包裹取消订阅:
setTimeout(() => _loadGroupsSubscription.unsubscribe());
添加.delay(0)
运算符,基本上是一样的技巧:
var _loadGroupsSubscription = getRootGroupNodes()
.retry(3)
.delay(0)
.subscribe(
groups => {
console.log(groups);
},
err => { this._log.logMessage("failed to retrieve groups"); },
() => {
_loadGroupsSubscription.unsubscribe();
}
);
观看现场演示:https://jsbin.com/sunicoq/2/edit?js,console
看到一个稍微类似的问题,解释这是如何工作的:
我正在尝试 return 一个将 return 数据如下的可观察对象。
getRootGroupNodes(): Observable<Group[]> {
return Observable.create(function(observer) {
var groups = [
{ groupName: "Group1" },
{ groupName: "Group2" }
]
observer.next(groups);
observer.complete();
});
}
当我尝试食用它时
this._loadGroupsSubscription = this._apiGroupService.getRootGroupNodes()
.retry(3)
.subscribe(
groups => {
// do somethign with groups
},
err => { this._log.logMessage("failed to retrieve groups"); },
() => {
this._loadGroupsSubscription.unsubscribe();
}
);
我得到 this._loadGroupsSubscription
是 null
。因此抛出异常试图调用未定义的取消订阅。任何想法我做错了什么?这应该是基本的..
确实没有在回调中分配变量。我认为有两种方法可以解决这个问题:
用
setTimeout()
包裹取消订阅:setTimeout(() => _loadGroupsSubscription.unsubscribe());
添加
.delay(0)
运算符,基本上是一样的技巧:var _loadGroupsSubscription = getRootGroupNodes() .retry(3) .delay(0) .subscribe( groups => { console.log(groups); }, err => { this._log.logMessage("failed to retrieve groups"); }, () => { _loadGroupsSubscription.unsubscribe(); } );
观看现场演示:https://jsbin.com/sunicoq/2/edit?js,console
看到一个稍微类似的问题,解释这是如何工作的: