2016-11-08 62 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