Фильтровать документы pouchdb в списке по идентификатору из другого документа — два последовательных обещания

#angularjs #angular #pouchdb

#angularjs #angular #pouchdb

Вопрос:

У меня есть два типа документов в pouchdb:

  • задачи — список задач
  • пользователь — просто номер пользователя, введенный в pochdb отдельной формой

Когда я пишу задачи, у меня также есть переменная для UserNo. Таким образом, я знаю, какие задачи у него есть. У меня есть две функции в provider для получения задач и номера пользователя.

В списке html я хочу фильтровать задачи по номеру пользователя через канал:

 <ion-item-sliding *ngFor="let todo of todos | filter : 'numer_p' : this.todoService.userNo">
  

Если я ввожу это число вручную, оно отлично работает. Задачи фильтруются по этому номеру.

Проблема в том, что у меня есть два вызова в home.ts ionViewLoaded:

     //call provider to get all docs to show on the list
this.todoService.getTodos().then((data) => {
this.todos = data;
});

//call provider to get userNo from pouchdb and set variable in the provider
this.todoService.getUser().then((result) => {
    console.log("getBadacz result:"   JSON.stringify(result));
    this.todoService.userNo = result['name'];
}).then(function(second){;
    console.log("second");
});
  

Мне нужно вызвать getTodos ПОСЛЕ getUser. Поэтому мне нужно последовательно запускать эти функции, используя обещания.
Без этого this.todoService.UserNo в фильтре не определено, поскольку оно еще не установлено. И это не сработает.

Я пытался сделать это так:

     this.todoService.getUser().then((result) => {
    console.log("getBadacz result:"   JSON.stringify(result));
    this.todoService.userNo = result['name'];
}).then(function(second){;
    console.log("second");
    this.todoService.getTodos().then((data) => {
        this.todos = data;
    });
});
  

Но есть ошибка:

 EXCEPTION: Error: Uncaught (in promise): TypeError: Cannot read property 'todoService' of null
  

Я попытался упорядочить эти обещания по порядку, но безуспешно.

Вот скрипка, в которой вы можете найти реализацию функций в provider: Фильтровать документы pouchdb по идентификатору пользователя, сохраненному в другом документе

Большое вам спасибо за вашу помощь.

Комментарии:

1. Это angular2? Попробуйте удалить this. из this.todoService.userNo вашего html-шаблона

2. Я думал, что это связано с проблемой «спешки». Кажется, я слишком усложнил это 🙂 Спасибо! Это работает.

Ответ №1:

В подобной ситуации я бы попытался включить идентификатор пользователя в ключ todo, что повысило бы производительность (документ todos может иметь такой ключ userId_todoId ).

Таким образом, вам вообще не понадобятся два обещания.