Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何告诉一个观察者我的数组是完整的_Javascript_Arrays_Rxjs_Observable - Fatal编程技术网

Javascript 我如何告诉一个观察者我的数组是完整的

Javascript 我如何告诉一个观察者我的数组是完整的,javascript,arrays,rxjs,observable,Javascript,Arrays,Rxjs,Observable,TLDR:我如何告诉一个观察到的数组完成。例如,见 我是一个新的观察者,所以我可能从错误的角度来看待这个问题。鉴于下面的代码,我应该做些什么来让用户的站点数组“完成”呢 let firstUser={ 姓名:'苏珊', 地点:[ {公司:'ABC公司',角色:'admin'}, {公司:'XYZ Co',角色:'reader'} ] }; 用户=新接收行为主体(第一用户); 已授权的功能(授权角色){ //检查当前用户是否具有authorizedRoles角色之一 返回此.user .do(us

TLDR:我如何告诉一个观察到的数组完成。例如,见

我是一个新的观察者,所以我可能从错误的角度来看待这个问题。鉴于下面的代码,我应该做些什么来让用户的站点数组“完成”呢

let firstUser={
姓名:'苏珊',
地点:[
{公司:'ABC公司',角色:'admin'},
{公司:'XYZ Co',角色:'reader'}
]
};
用户=新接收行为主体(第一用户);
已授权的功能(授权角色){
//检查当前用户是否具有authorizedRoles角色之一
返回此.user
.do(user=>console.log(“检查用户:”,JSON.stringify(用户)))
.flatMap(用户=>user.sites)
.do(res=>console.log(“映射的用户角色:”,res))
.first(site=>authRoles.indexOf(site.role)!==-1)//仅当角色匹配时返回
.do(res=>console.log('First:',res))
.map(res=>true)
}
//这一个找到匹配项并完成
授权(['writer'、'admin'、'reader'])。订阅(res=>{
log(“1:isAuthorized?:”,res);
},err=>{
log(“1:错误:用户未授权!”);
}, () => {
console.log(“1:授权检查完成!”);
});
//这个永远不会完成
授权(['writer','foo'])。订阅(res=>{
log(“2:isAuthorized?:”,res);
},err=>{
log(“2:错误:用户未授权!”);
}, () => {
日志(“2:授权检查已完成!”);
});
请注意,(首先)[如果找不到错误,则应该抛出错误,但只有在可观察对象完成时才会抛出错误

如果找到匹配项,上述内容将正确且完整地返回,但如果没有匹配项,它将永远不会完成或出错,因为user.sites数组永远不会完成

是否有办法使阵列完整?如果我先获取/订阅用户,我可以让它工作:

//
//假设fetchedUser是以更安全/更理智的方式获取的
//获取用户并设置它
让我们一起去吧;
订阅(user=>fetchedUser=user);
功能授权2(授权角色){
//检查当前用户是否具有authorizedRoles角色之一
返回(this.fetchedUser.sites)的可观测接收值
.do(sites=>console.log(“auth2:检查用户站点:”,sites))
.flatMap(站点=>站点)
.do(res=>console.log(“映射的用户角色:”,res))
.first(site=>authRoles.indexOf(site.role)!==-1)//仅当角色匹配时返回
.do(res=>console.log('First:',res))
.map(res=>true)
}
我觉得我错过了一个关键但简单的步骤,无法使用纯可观测数据来实现这一点。提前感谢您的帮助!

Rx.observate.of(this.fetchedUser.sites)
将其参数转换为可观察序列,然后完成。这会触发
。首先
运算符引发异常。您永远不会完成
This.user
主题。您可以将其更改为
This.user.take(1)
甚至
Rx.observable.of(fetchedUser)
并跳过将其作为行为主题(如果希望完成)。或者,您可以将
首先
更改为
.map
,以便在用户未经授权时返回false。下面是使用
take
操作符的示例

const user=Rx.Observable.create((o)=>{
window.setTimeout(()=>{
o、 下一个({
姓名:'苏珊',
地点:[
{公司:'ABC公司',角色:'admin'},
{公司:'XYZ Co',角色:'reader'}
]
});
}, 1000);
});
已授权的功能(授权角色){
返回用户
.采取(1)
.flatMap(用户=>user.sites)
.first(site=>authRoles.indexOf(site.role)!=-1)
.map(res=>true);
}
授权(['writer'、'admin'、'reader'])。订阅(res=>{
log(“1:isAuthorized?:”,res);
},err=>{
log(“1:错误:用户未授权!”);
}, () => {
console.log(“1:授权检查完成!”);
});
授权(['writer','foo'])。订阅(res=>{
log(“2:isAuthorized?:”,res);
},err=>{
log(“2:错误:用户未授权!”);
}, () => {
日志(“2:授权检查已完成!”);
});

@Dom我不知道你在说什么。第二个例子显示了使用类似的东西,但我觉得这不是正确的方法,或者找不到任何其他的文章。我在JSBin中介绍了使用Rx.Observable.of,但我想我真正想知道的是,我能知道或者以某种方式告诉它“完成”吗给定的可观察数组?我确实知道我给出的示例实际上并不是如何使用它们,但它确实代表了与实际用例所需的逻辑相似的逻辑。如前所述,您的答案的最后一部分是正确的。@jrose the
。take(1)
将在一个项目通过流后完成流。您希望在什么条件下完成?我希望它在所有“站点”之后完成@jrose只有一个项目在流中流动,直到flatMap。因此,如果在flatMap之前对静态值使用
of
运算符,或对可观察对象使用
take
,则在所有站点流动之后完成。@jrose我添加了一个使用
take
的示例。