我正在編寫一項服務,用戶可以從Spotify播放列表中粘貼網址,然後將播放列表導出到其他服務中。對於需要粘貼到請求中的每個跟蹤網址,都需要對Spotify API進行操作。限制由rxjs進行的http調用
此代碼:
Rx.Observable.fromArray<ITrackIdentifier>(this._allTracks)
.pluck<string>("id")
.distinct()
.flatMap(
(trackId) => this.spotifyService.lookupTrack(trackId).
catch((error) => this.handleError(error)))
.subscribe(
(result) => this.handleTrackLookupResult(result),
(error) => this.handleError(error),
() => this.handleComplete()
);
- 創建從ITrackIdentifiers
- 列表可觀察到取軌道標識的ID來創建一個可觀察的字符串(IDS)
- 刪除任何重複的ID在列表中
- 爲每個http調用創建一個可觀測值以進行發現(並捕獲錯誤)
- 合併將所有這些可觀測量的結果合併爲一個具有平面圖的流
除了添加大量曲目之外,這實際上工作正常。我的樣本播放列表中有一個樣本播放列表超過500個,因此立即進行了500個調用,瀏覽器需要處理它們並從緩存中返回項目,以便瀏覽器速度較慢並鎖定,並且由於我超出api調用限制,Spotify會返回大量錯誤。
我想只能說10個電話同時運行。 Merge with maxConcurrent集似乎是在Stackoverflow上討論的完美解決方案。
這應該是這樣的:
Rx.Observable.fromArray<ITrackIdentifier>(this._allTracks)
.pluck<string>("id")
.distinct()
.map(
(trackId) => this.spotifyService.lookupTrack(trackId).
catch((error) => this.handleError(error)))
.merge(10)
.subscribe(
(result) => this.handleTrackLookupResult(result),
(error) => this.handleError(error),
() => this.handleComplete()
);
但它是行不通的。在Chrome網絡調試器中,您可以看到同時進行的所有呼叫,並且大多數時間排隊等待直到它們失敗。
爲什麼不能正常工作?我還可以繞過這個問題嗎?
這裏是Github checkin與這個階段的項目:
合併工作,因爲它應該。 它限制了訂閱的數量。 但是在'合併'之前,你有一個'map',它實際上提出所有請求,然後'合併'踢入。 – psx