Запрос Cloud Firestore работает иногда, но не всегда

Это меня действительно поставило в тупик. У меня есть метод, который ищет элементы в базе данных Firestore. Он работает, когда я вызываю метод непосредственно из разового теста. Это не работает, когда я вызываю метод из другой части моего приложения с тем же самым вводом.

Вот метод, который выполняет поиск:

  getProductsStartingWithCategory(textSoFar: string): Observable<Product[]> {
    console.info('searching for ', textSoFar);
    let endAt = textSoFar + '\uf8ff';
    let filteredCollection: AngularFirestoreCollection<Product> =
      this.afs.collection('products', ref =>
        ref.orderBy('materialType').limit(30).startAt(textSoFar).endAt(endAt)
      );

    return filteredCollection.snapshotChanges().map(changes => {
      return changes.map(a => {
        console.info('matched one', a);
        const data = a.payload.doc.data() as Product;
        data.id = a.payload.doc.id;
        return data;
      });
    });
  }

И когда я вызываю метод прямо с первой страницы приложения с помощью тестовой кнопки, он работает. Этот метод выглядит следующим образом:

  testTheThing() {
    let text: string = 'Car';
    this.productService.getProductsStartingWithCategory(text)
      .subscribe(data => {
        console.info('success', data);
      });
  }

Опять же, когда я вызываю этот метод, я получаю ожидаемые результаты (сопоставление продуктов в базе данных с типом материала «Ковер»). Успех!

Но затем, когда я использую метод с другой страницы в приложении, он не возвращает результатов. Эта страница немного сложнее - по сути, метод вызывается при изменении пользовательского ввода. Вот соответствующие части метода:

productCategoryChanged(productPurchase: ProductPurchase) {
if (productPurchase.materialType) {
  console.info('searching for products starting with "' + productPurchase.materialType + '"');

  let unsubscribe = this.productService.getProductsStartingWithCategory(productPurchase.materialType).subscribe(products => {
    products.forEach(product => {
      // logic goes here...
    });
  });
  // rest of method omitted

В обоих сценариях я вижу «поиск автомобиля» в сообщении console.info. Текст поиска идентичен. Я много раз пробовал использовать различные поисковые запросы (все они есть в базе данных). Ведение журнала показывает, что метод вызывается с правильным вводом, но по какой-то причине я нахожу результаты только при вызове его из "тестового" метода. Это почему?

Я пробовал обрезать ввод. У меня есть еще одна коллекция «продуктов», подключенных к наблюдаемому, но я не думаю, что это имеет значение. Я также использовал эту точную стратегию для поиска «клиентов», и она отлично работает. Этот поиск "продукты" почти идентичен, но не работает.

Можете ли вы показать полный журнал консоли? Одинакова ли в обоих случаях заглавная буква «Автомобиль»? Находится ли this.productService в одном и том же состоянии оба раза? Вероятно, проблема не в опубликованном вами коде, поэтому, вероятно, она находится в другом месте вашего кода.

Dan McGrath 05.05.2018 06:35

Оказалось, что это ошибка, когда я не отписывался от наблюдаемого.

emulcahy 25.11.2018 04:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
297
0

Другие вопросы по теме