2016-11-08 57 views
1

我试图返回一个将返回数据的observable,如下所示。当取消订阅被调用时Observable为空

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._loadGroupsSubscriptionnull。因此,试图在undefined上调用unsubscribe时会引发异常。任何想法我做错了什么?这应该是基本的..

回答

2

确实没有在回调中分配变量。我觉得这里有两种方法来处理这个问题:

  1. 裹退订与setTimeout()

    setTimeout(() => _loadGroupsSubscription.unsubscribe()); 
    
  2. 添加.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

看到一个稍微类似的问题,并解释它是如何工作的:Other operator in calculation chain than combineLatest to avoid redundant calculations