подписка и ошибка «Не удается прочитать свойство» - PullRequest
0 голосов
/ 27 апреля 2018

Я не могу понять, почему я получаю ошибку 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 голосов
/ 27 апреля 2018

this.group_users устанавливается в режиме обратного вызова асинхронно, и это может произойти после запуска строки this.group_users.length. Возможно, вам придется перестроить свою логику.

0 голосов
/ 27 апреля 2018

@ 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 по-прежнему равен нулю.

0 голосов
/ 27 апреля 2018

Если this.ws.call() возвращает асинхронного наблюдателя, то ваш обратный вызов внутри подписки не будет выполняться до после , когда ваша функция вернулась (очень похоже на then на Promise). Так что this.group_users не устанавливается, когда вы пытаетесь получить к нему доступ.

Вам необходимо сопоставить наблюдаемое со значением, которое вы хотите проверить, а затем вернуть новое наблюдаемое. Что-то вроде return this.ws.call('group.query', [[["id","=", user.group.id]]]) .map(res => res[0].length === 1)

Затем вы можете подписаться на checkbox_confirm_show или использовать асинхронный канал в своем шаблоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...