2016-08-29 25 views
2

私は、ユーザIDをクッキーから受け取り、クッキーに見つからなければ、それをAPIから取得する観測可能なストリームを作成しようとしています。 RxJSでどうすればいいですか?RxJS:別の観測値から観測可能なデフォルト値を設定する

var userIdRequest = Rx.Observable.bindCallback(generateIdAsync); 
var cookieUserIdStream = Rx.Observable.of(getCookieValue("user_id")) 
    .filter(x => x !== null); 

var userIdStream = cookieUserIdStream.__ifEmptyThen__(userIdRequest()); // <<< ??? 

// Emulating async request for user id 
// Will be a JSONp call in real app 
function generateIdAsync(cb) { 
    setTimeout(() => { 
     cb(`id_${new Date().getTime()}`); 
    }, 300); 
} 

function getCookieValue(name) { 
    var regexp = new RegExp(`${name}=([^;]*)`); 
    var match = document.cookie.match(regexp); 

    return match && match[1]; 
} 

だけではなく、観測との単純な値で動作しますdefaultIfEmpty方法があります。 Bacon.jsにはストリーム用のorメソッドがありますが、これは完璧に機能しますが、RxJSには何も表示されません。何かを見逃したり、カスタムオブザーバーを実装する必要がありますか?

答えて

5

あなたは2つの観測をCONCATし、最初の放出された値を取得することがあります。

var userIdStream = Rx.Observable.concat(cookieUserIdStream, userIdRequest).first(); 
+0

感謝の男は、あなたが私の痛みを解消しました! – coquin

+0

これはとても実用的です;) –

関連する問題