Это меня действительно поставило в тупик. У меня есть метод, который ищет элементы в базе данных 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. Текст поиска идентичен. Я много раз пробовал использовать различные поисковые запросы (все они есть в базе данных). Ведение журнала показывает, что метод вызывается с правильным вводом, но по какой-то причине я нахожу результаты только при вызове его из "тестового" метода. Это почему?
Я пробовал обрезать ввод. У меня есть еще одна коллекция «продуктов», подключенных к наблюдаемому, но я не думаю, что это имеет значение. Я также использовал эту точную стратегию для поиска «клиентов», и она отлично работает. Этот поиск "продукты" почти идентичен, но не работает.
Оказалось, что это ошибка, когда я не отписывался от наблюдаемого.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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