2017-01-21 3 views
0

У меня есть onInit обработка, где вызываются некоторые данные БД, а затем объединены вместе. Я не могу вставить весь мой метод здесь, так как он не отформатирован должным образом.Angular2 и фильтр массива/find

u.skills.forEach(s => { 
    let skillEntry: SkillEntry = new SkillEntry(); 
    skillEntry.skill = s; 

    let sbs: SkillBase[] = this.cachedSkillBases.filter(sb => sb.id == s.skillBaseId); 
    if (sbs.length>0) { 
     skillEntry.skillBase = sbs[0]; 
    } else { 
     console.log('not found'); 
     this._userService.getSkillBase(s.skillBaseId).toPromise() 
     .then(res => { 
      skillEntry.skillBase = res; 
      this.cachedSkillBases.push(res); 
     }); 
    } 
}); 

У меня есть временный кеш, реализованный здесь, чтобы ускорить работу, но поиск его не работает. В частности, я не знаю, почему эта фильтрация не работает, если переменная «s» существует и всегда имеет правильный идентификатор

let sbs: SkillBase[] = this.cachedSkillBases.filter(sb => sb.id == s.skillBaseId); 

ли что-то я здесь отсутствует?

+0

skillBaseId устанавливается автоматически на новый()? – misha130

+0

Просто предположите, измените свой '==' на '==='. Сделать разницу? –

+0

skillBaseId происходит из ранее загруженной базы данных. Он всегда существует и определенно не является проблемой. В противном случае вызов службы, который будет дальше, также потерпит неудачу. Выполнение === не помогает. – smoczyna

ответ

0

Реализация вашего кеша асинхронна, это означает, что во время цикла вы получите 100% промаха кеша и несколько дублированных запросов. Обещание then выполнено async или некоторое время позже.

+0

У меня нет обещаний, а затем звонки через кеш. Он инициализируется вместе с компонентом и никогда не очищается. Доступ к нему осуществляется только по выделенной строке, тогда он не должен быть асинхронным. Не могли бы вы рассказать? – smoczyna

+0

Вы вызываете http в другом случае, все эти вызовы будут завершены после цикла forEach. Просто добавьте console.log в соответствующие места, и вы увидите, как это работает. – kemsky

+0

это нормально, но почему записи не могут быть найдены во втором запуске? После первого вызова мой кеш должен быть полностью заполнен, а обновление страницы не должно вызывать никаких HTTP-вызовов, но это происходит. Консоль также показывает все записи, которые должны быть в кеше перед циклом. – smoczyna

0

Хорошо, вот мой полный метод. Я понимаю, что данные не доступны для самого первого запуска, но почему мой локальный кеш не работает после этого, похоже, что он когда-либо пуст или так? К сожалению, я не могу вставить весь метод сразу, потому что он отклонен этой страницей (неправильно отформатирован). Над этим вставным здесь я имею только объявление метода, в то время как массивы кэша объявляются на уровне компонента.

** частные getUsers() {***

let fetchedUsers: User[];
 
let userEntries: UserEntry[] = []; 
let skillEntries: SkillEntry[]; 

this._userService.getAllUsers(this.searchForm.userName, this.searchForm.skillName, this.searchForm.groupName)
 
    .toPromise()
 
    .then(result => { 
    fetchedUsers = result; 
    fetchedUsers.forEach(u => { 
     let userEntry: UserEntry = new UserEntry(); 
     userEntry.detail = u; 

     skillEntries = []; 
     u.skills.forEach(s => { 
     let skillEntry: SkillEntry = new SkillEntry(); 
     skillEntry.skill = s; 

     let sbs: SkillBase; 
     Promise.all(this.cachedSkillBases).then(res => { 
      sbs = res.find(sb => sb.id == s.skillBaseId); 
     }); 

     if (sbs) { 
      skillEntry.skillBase = sbs; 
     } else { 
      this._userService.getSkillBase(s.skillBaseId).toPromise() 
      .then(res => { 
       console.log('got skills'); 
       skillEntry.skillBase = res; 
       this.cachedSkillBases.push(res); 
      }); 
     } 

     if (s.skillDetailId) { 
      let sds: SkillDetail; 
      Promise.all(this.cachedSkillProficiencies).then(res => { 
      sds = res.find(sd => sd.id == s.skillDetailId); 
      }); 
      if (sds) { 
      skillEntry.skillProficiency = sds; 
      } else { 
      this._userService.getSkillProficiency(s.skillDetailId).toPromise() 
       .then(res => { 
       console.log('got proficiencies'); 
       skillEntry.skillProficiency = res; 
       this.cachedSkillProficiencies.push(res); 
       }); 
      } 
     } 
     skillEntries.push(skillEntry); 
     }); 
     console.log('setting users'); 
     userEntry.skills = skillEntries; 
     userEntries.push(userEntry); 
    }) 
    }) 
    .then(res => this.users = userEntries); 
+0

другим приемлемым решением было бы заставить этот код возвращать пользователей в конце, когда все остальное будет завершено, поэтому сообщение console.log («настройка пользователей») будет отображаться как последнее, а не первое в консоли, поскольку оно Теперь. Таким образом я могу избавиться от своих неработающих кешей. – smoczyna