RxJS:从另一个observable设置observable的默认值

时间:2016-08-29 05:21:40

标签: rxjs

我正在尝试创建可观察的流,该流从cookie获取用户ID,如果在cookie中找不到,则从API获取它。我怎么能在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方法仅适用于简单值,而不适用于observable。在Bacon.js中有流的or方法,它工作得非常好,但我在RxJS中看不到任何类似的东西。我是否会遗漏某些内容或者是否需要实现自定义观察者?

1 个答案:

答案 0 :(得分:9)

您可以连接2个可观察量并获得第一个发射值:

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