Javascript 从可观察到的内部返回

Javascript 从可观察到的内部返回,javascript,angular,typescript,Javascript,Angular,Typescript,从根本上说,我认为我做错了什么。我试图通过从过滤列表中提取一个实体来找到它,如果那个里并没有实体,我需要创建一个实体 我觉得这个函数是错误的,因为我应该返回一个可观察的,而不是什么都不返回 getOrCreateNew(receiverId: number) : Observable<Conversation> { var userId = this.identity.userInfo.id; //TODO: you should be using an expre

从根本上说,我认为我做错了什么。我试图通过从过滤列表中提取一个实体来找到它,如果那个里并没有实体,我需要创建一个实体

我觉得这个函数是错误的,因为我应该返回一个可观察的,而不是什么都不返回

getOrCreateNew(receiverId: number) : Observable<Conversation> {
    var userId = this.identity.userInfo.id;

    //TODO: you should be using an expression here, and having a builder for generating your
    //filters in case you want to switch them in the future
    var employerFilter = new PropertyFilterNode("EmployerUserId", FilterCondition.Equal, receiverId.toString());
    var employeeFilter = new PropertyFilterNode("EmployeeUserId", FilterCondition.Equal, userId.toString());
    let conversationFilter = new BinaryFilterNode(employerFilter, employeeFilter, Combiner.Or);

    this.getList(conversationFilter).subscribe(entities => {
        if (entities == null || entities.length == 0) {
            let conversation: Conversation;
            conversation.employerUserId = receiverId;
            conversation.employeeUserId = userId;
            return this.create(conversation);
        }
        else {
            let entity = entities[0];
            return Observable.of(entity); //.Return(entity)
        }
    });

    return null;
}
getOrCreateNew(接收方ID:number):可观察{
var userId=this.identity.userInfo.id;
//TODO:您应该在此处使用表达式,并使用生成器生成
//过滤器,以备将来需要切换时使用
var employerFilter=新的PropertyFilterNode(“EmployerUserId”,FilterCondition.Equal,receiverId.toString());
var employeeFilter=newpropertyfilterNode(“EmployeeUserId”,FilterCondition.Equal,userId.toString());
让conversationFilter=new BinaryFilterNode(employerFilter、employeeFilter、Combiner.Or);
this.getList(conversationFilter).subscribe(entities=>{
if(entities==null | | entities.length==0){
让对话:对话;
conversation.employerUserId=接收方ID;
conversation.employeeUserId=userId;
返回此。创建(对话);
}
否则{
让实体=实体[0];
可观察的回报(实体);//回报(实体)
}
});
返回null;
}

如何返回从内部订阅返回的可观察对象?

返回
放在
之前。getList
也:

return this.getList(conversationFilter).subscribe(entities => {

getList
subscription的工作方式表明它应该是
mergeMap
switchMap
(考虑到
create
也返回一个可观察的值):


在这种情况下,应该订阅从
getOrCreateNew
返回的可观察对象,以便发出值,因为它没有在内部订阅。

如何使用
getOrCreateNew
?它似乎返回
null
,但被键入为返回可观察值。此外,您在多个位置有可能掩盖错误的类型批注。Get list返回一个Observable我需要使用该值然后有条件地返回其中的Observable我需要它来返回Observable您应该使用
mergeMap
flatMap
,而不是subscribe。
return this.getList(conversationFilter).mergeMap(entities => {
    if (entities == null || entities.length == 0) {
        let conversation: Conversation;
        conversation.employerUserId = receiverId;
        conversation.employeeUserId = userId;
        return this.create(conversation);
    }
    else {
        let entity = entities[0];
        return Observable.of(entity); //.Return(entity)
    }
});