繁体   English   中英

在angular2的服务层上修改对象:无法将订阅分配给可观察的类型

[英]Modifying object at service layer in angular2: Subscription is not assignable to the type observable

我是Angular2框架的新手,因此如果这是一个基本问题,请原谅。

我正在通过HTTP包装返回的服务层处理对象。 该对象应该传递给组件,但是首先应该对数据进行操作,并且仅提取和转发必要的数据。

当我尝试执行此操作时,我收到错误消息“无法将订阅分配给可观察的类型”。 这是代码

return this.httpGet<UserInfo[]>(url, {headers}).switchMap(data => data)
.subscribe(
    data => {
        console.log("new values are going to be" + JSON.stringify( data[0].address.addressLine1));
        this.userInfo[0].name = "test name";
        this.UserInfo[0].address.city = data[0].address.city;
        this.UserInfo[0].address.state = data[0].address.state;
    },
);

现在,我认为有意义的是,首先在订阅中将其转换回流时将其转换为数据,然后显式返回该对象,但这也无法提供所需的输出,即使类型是可观察的也是如此。 来自Java oop背景,在这里我看不到问题是什么,这是一个非常困惑的问题。 任何见解均表示赞赏。

编辑:为了完成,在这里进行服务呼叫-

   this.inputFormControl.valueChanges
.debounceTime(4000)
.switchMap(query => this.userService.search(query))
.subscribe(
    data => {
        this.data = data;
    },
);

在您当前的代码中,您已经订阅了观察者。 这样就返回了Subscription而不是Observable。 然后在您的调用函数中,尝试将其分配给可观察对象。 尝试以下模式

   someFunction() {
    return this.httpGet<UserInfo[]>(url, {headers}).switchMap(data => data)
    }

    callingFuction(){
    someFunction().subscribe(
        data => {
            console.log("new values are going to be" + JSON.stringify( data[0].address.addressLine1));
            this.userInfo[0].name = "test name";
            this.UserInfo[0].address.city = data[0].address.city;
            this.UserInfo[0].address.state = data[0].address.state;
        },
    );
    }

如其他答案中所述,您将返回订阅而不是Observable。 我也看不出为什么在服务中需要使用switchMap (我假设您在服务中有http请求),因为您正在组件中使用它。 因此,我将在服务中进行map在那里修改数据并将其返回给您的组件。

再指出一件事,在当前代码中,您不会从http请求中返回任何内容,因此您需要添加一个return语句。

return this.httpGet<UserInfo[]>(url, {headers})
  .map(data => {         
     this.UserInfo[0].name = "test name";
     this.UserInfo[0].address.city = data[0].address.city;
     this.UserInfo[0].address.state = data[0].address.state;
     return this.UserInfo; // add return!
  });

您的组件代码将保持原样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM