RxJS:从另一个可观察对象设置可观察对象的默认值

5

我想创建一个可观测流,从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方法,只适用于简单值,而不适用于可观察对象。在Bacon.js中,有一个针对流的or方法,运行得非常良好,但是我在RxJS中没有看到类似的东西。我是否遗漏了什么或者需要实现一个自定义的观察者?

1个回答

9
您可以将这两个可观察对象连接起来,并获取第一个发出的值:
var userIdStream = Rx.Observable.concat(cookieUserIdStream, userIdRequest).first();

就是这样,非常实用 ;) - Burak Tasci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接