From 040ccfe801583d6e8599ef739f0cb09ddd84e1c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guychard?= Date: Fri, 29 Mar 2019 15:55:40 +0100 Subject: [PATCH] Fix withFallback to emit from main even if fallback has emitted Fixes #3039 `withFallback()` used `rxjs.race()` to fallback to basic-code-intel if the language server had not emitted after 500ms. The problem is that `race()` works as follows: > The observable to emit first is used. This is an issue when pinning the hover tooltip, because if the basic-code-intel result is used first, the language server result will *never be used*. --- src/lang-go.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/lang-go.ts b/src/lang-go.ts index bafa53e..cdc41e8 100644 --- a/src/lang-go.ts +++ b/src/lang-go.ts @@ -22,6 +22,7 @@ import { combineLatest, ObservableInput, merge, + timer, } from 'rxjs' import { concatMap, @@ -557,12 +558,14 @@ function withFallback({ fallback: ObservableInput delayMilliseconds: number }): Observable { - return race( - of(null).pipe(switchMap(() => from(main))), + const mainObservable = from(main).pipe(share()) + return merge( of(null).pipe( delay(delayMilliseconds), - switchMap(() => from(fallback)) - ) + switchMap(() => from(fallback)), + takeUntil(mainObservable) + ), + mainObservable ) }