订阅和`无法读取属性`错误

时间:2018-04-27 02:50:25

标签: angular

当我将查询Cannot read property的值视为group.query时,我无法理解为什么会出现{"id":40,"gid":1000,"group":"test","builtin":false,"sudo":false,"users":[47,44]}错误

enter image description here

      checkbox_confirm_show(id: any){
    let user: any
    user = _.find(this.usr_lst[0], {id});
    this.ws.call('group.query', [[["id","=", user.group.id]]]).subscribe(res=>{
      this.group_users = res[0];
    })
    if(this.group_users.length === 1){
      return true
    };
    return false

  }

3 个答案:

答案 0 :(得分:0)

如果this.ws.call()正在返回一个异步观察者,那么在你的函数返回之后 之前,你的回调将不会运行(非常类似于Promise上的then) 。因此,当您尝试访问时,this.group_users未设置。

您需要将Observable映射到要检查的值,然后返回新的Observable。就像是 return this.ws.call('group.query', [[["id","=", user.group.id]]]) .map(res => res[0].length === 1)

然后,您可以订阅checkbox_confirm_show或在模板中使用异步管道。

答案 1 :(得分:0)

this.group_users在回调中异步设置,这可以在this.group_users.length行运行后发生。您可能需要重构您的逻辑。

答案 2 :(得分:0)

@ryansilva是对的。 你的

this.ws.call('group.query', [[["id","=", user.group.id]]]).subscribe(res=>{
      this.group_users = res[0];
    })

是一个异步函数,当该函数返回时,您将设置this.group_users的值,但是您的代码if(this.group_users.length === 1)不会等待它完成,所以当它运行时,group_user仍为null。