2017-02-14 20 views
0

我有這樣一段代碼,其由組件調用:爲什麼上次調用執行3次?

choose(n?: number): Observable<PickQuality[]> { 
    var chosenObserver: Observer<PickQuality[]>; 
    alert(n); // <-- Notice this line 

    this.getOptions().subscribe(options => { 
      alert(n); // <-- And this one 
      this.reevaluate(); 

      var sorted = options.sort((a, b) => b.score - a.score); 
      var chosen: PickQuality[]; 

      if(n) chosen = sorted.slice(0, n); 
      else chosen = sorted.slice(0, 1); 

      chosenObserver.next(chosen); 
    }); 

    let obs = new Observable<PickQuality[]>(observer => chosenObserver = observer); 
    return obs; 
} 

該呼叫被以下:

test.choose().subscribe(a => console.log(a)); 
    test.choose(5).subscribe(b => console.log(b)); 
    test.choose(15).subscribe(c => console.log(c)); 

的第一呼叫正確地提醒打印(「未定義」,「5」 ,「15」),但第二次打印「15」3次。爲什麼會發生這種情況?它正常工作,但我做了一些改變(並且無法跟蹤)改變了這一點,我似乎無法修復它。

+0

路易斯你好。你的代碼看起來很複雜。你有一個函數創建表外業務,那麼訂閱obsB對錶外業務發出值,然後最後返回OBSC換行表外業務....當然這可以簡化。你能從概念上描述**你的'choose()'函數應該達到什麼目的? – AngularChef

+0

PickQuality有一個與分數關聯的對象(通過HTTP GET請求獲取)。我的getOption()獲取這些數組的數組,並選擇(n?)應該返回一個由這些分數排序的n大小的子數組。 –

回答

0

我猜在這裏,但我想你想分享通過分享訂閱()。

當訂閱發佈的可觀察的觀察員人數從0到1,我們連接到底層觀察到的序列。

當加入第二用戶,不需要額外的訂閱被添加到 底層觀察到的序列。因此,導致邊 效果的操作不會針對每個用戶重複進行。

constructor() { 
    this.observable = ....share() 
} 

getOptions() { 
    return this.observable; 
} 
+0

但我只有一個觀察者,這是包含我的choose()代碼的服務。爲了讓我的組件調用.subscribe(),是不是應該創建和返回? –

+0

是的,會有一個可觀察的,但將添加多個訂閱。如果你想共享訂閱(所以它不重複每個訂閱者),然後使用'share'操作符。 – pixelbits

+0

我嘗試使用我的類可觀察到的領域,做'如果(this.obs!)返回新的可觀察(觀察員=> chosenObserver =觀察員);'' 否則返回this.obs.share(); '但它似乎也不起作用 –

相關問題