【发布时间】:2017-11-14 07:09:33
【问题描述】:
TLDR:如何告诉 Observed 数组完成。例如,请参阅this jsBin。
我是 Observables 的新手,所以我可能从错误的角度来看待这个问题。鉴于下面的代码or this jsBin,我应该做些什么不同的事情来让用户的网站数组“完成”。
let firstUser = {
name: 'Susan',
sites: [
{company: 'ABC Co', role: 'admin'},
{company: 'XYZ Co', role: 'reader'}
]
};
user = new Rx.BehaviorSubject(firstUser);
function authorized(authRoles) {
// check if the current user has one of the authorizedRoles roles
return this.user
.do(user => console.log("Checking user: ",JSON.stringify(user)))
.flatMap( user => user.sites )
.do(res => console.log("Mapped user roles: ",res))
.first( site => authRoles.indexOf(site.role) !== -1 ) // only return when a role matches
.do( res => console.log('First: ',res))
.map( res => true)
}
// This one finds a match and completes
authorized(['writer','admin','reader']).subscribe(res =>{
console.log("1: isAuthorized?: ",res);
}, err => {
console.log("1: ERROR: User is not authorized!");
}, () => {
console.log("1: Authorized check completed!");
});
// This one never completes
authorized(['writer','foo']).subscribe(res =>{
console.log("2: isAuthorized?: ",res);
}, err => {
console.log("2: ERROR: User is not authorized!");
}, () => {
console.log("2: Authorized check completed!");
});
请注意,(first)[http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-first] 如果找不到错误,则应该抛出错误,但前提是 Observable 完成。
如果找到匹配项,上述内容将正确返回并完成,但如果没有匹配项,它将永远不会完成或出错,因为 user.sites 数组永远不会完成。
有没有办法使数组完整?如果我先获取/订阅用户,我可以让它工作:
//
// Pretend that fetchedUser is fetched in a safer/more sane way
// fetch the user and set it
let fetchedUser;
user.subscribe(user => fetchedUser = user);
function authorized2(authRoles) {
// check if the current user has one of the authorizedRoles roles
return Rx.Observable.of(this.fetchedUser.sites)
.do(sites => console.log("auth2: Checking users sites: ",sites))
.flatMap( sites => sites )
.do(res => console.log("Mapped user roles: ",res))
.first( site => authRoles.indexOf(site.role) !== -1 ) // only return when a role matches
.do( res => console.log('First: ',res))
.map( res => true)
}
我觉得我错过了使用纯 Observables 让它工作的关键但简单的步骤。提前感谢您的帮助!
【问题讨论】:
-
@Dom 我不确定你在说什么。第二个例子展示了使用类似的东西,但我觉得这不是正确的方法,或者可以找到任何文章等,否则的话。
标签: javascript arrays rxjs observable