2017-02-09 58 views
0

什麼是Promise.resolve()(解決沒有任何價值很重要)?RxJS相當於Promise.resolve()

這裏有一個類似的問題:rxjs alternative to doing a Promise.resolve?

給出的解決方案(Observable.of(data))效果很好,如果我們提供的任何數據,但如果我們不提供一個值意義,我因爲沒有價值,所以.subscribe()不會觸發這不起作用。

在ionic2應用程序的Angular2服務中,我試圖將基於Promise的服務遷移到Observables。如果設備處於脫機狀態,則需要跳過序列中的某些步驟。有了承諾,我被扔的錯誤,後來趕上它的順序:

return this.connectivityService.isOnline() 
    .flatMap((isOnline: boolean) => { 
    if (isOnline) { 
     return Promise.resolve(); // work as expected, subscribe() is called 
    } else { 
     return Observable.throw(new OfflineError('The device is offline.')); 
    } 
    }) 
    .do(() => console.log('Do things here')); 

下面的代碼不會:

return this.connectivityService.isOnline() 
    .flatMap((isOnline: boolean) => { 
    if (isOnline) { 
     return Observable.of(); // subscribe() is not called 
    } else { 
     return Observable.throw(new OfflineError('The device is offline.')); 
    } 
    }) 
    .do(() => console.log('Do things here')); 

是否有可能實現與觀測是一回事嗎?隨意告訴我,如果我對可觀察量的使用不好,這對我來說是新的。

+0

嘗試返回虛擬數據:'返回Observable.of(1);' –

+0

@TiepPhan返回'Observable.of(1)'可以工作,但是imho,這比一個可行的解決方案更加黑客。 – bgondy

+1

'Observable.of(undefined)'是完全相同的。 – estus

回答

1

要回答這個問題以直接的方式:

Promise.resolve()相當於將Observable.of(undefined) - 但通常你能夠避免這樣的解決方法。

您是否簡化了您的代碼?因爲在你的情況實際上並不在這裏使用一個flatMap,你也可以簡單地直接拋出一個錯誤:

return this.connectivityService.isOnline() 
    .do((isOnline: boolean) => { 
    if (!isOnline) { 
     throw new OfflineError('The device is offline.'); 
    } 
    }) 
    .do(() => console.log('Do things here')); 

const isOnline$ = new Rx.BehaviorSubject(false); // some online-check-service-mock 
 

 
isOnline$ 
 
    .do(isOnline => { 
 
    if (!isOnline) { 
 
     throw new Error("You are offline!"); 
 
    } 
 
    }) 
 
    .do(() => console.log('Do things here')) 
 
    .subscribe(
 
    console.log, 
 
    error => console.error("Oops! ", error.message), 
 
    console.info 
 
);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+0

是的代碼段被簡化,當在線,我從遠程API獲取數據,我更新我的本地數據庫,我下載一些文件,以便他們可以可以脫機等。然後,我從我的本地數據庫獲取數據來呈現它(或多或少),遵循「脫機第一」應用程序的概念。 – bgondy

+0

'Observable.of(undefined)'正在按預期工作。我正在尋找一個特定的運營商,但我錯了。謝謝! – bgondy

+0

好的,但你仍然可以在附加的'flatMap'中在線獲取東西 - 實際上應該不需要這裏的'Observable.of'解決方法。 – olsn