Получить одно значение из наблюдаемого массива - PullRequest
0 голосов
/ 21 мая 2018

Как написать функцию, которая принимает Observable<T[]> и возвращает Observable<T>?

Например, у меня есть два метода:

getTransactions(): Observable<Transaction[]>{
        ...
    }
getTransaction(id: number): Observable<Transaction>{
    return this.getTransactions().pipe(find(txn => txn.id === id));
}

Я получаю ошибку такого типа«Наблюдаемый» нельзя назначить типу «Наблюдаемый».Тип «Транзакция [] нельзя назначить типу« Транзакция ».Свойство 'id' отсутствует в типе 'Transaction []'.

Как я понимаю, наблюдаемые функции канала (map, single, find, max и т. Д.) Относятся к потоку данных (т. Е. Поканаблюдаемое испускает несколько элементов с течением времени) и бесполезно, когда наблюдаемое испускает один элемент (который оказывается массивом) одновременно.

Как правильно написать функцию getTransaction(id)?Я попытался:

let transactions : Transaction[] = [];
this.getTransactions().subscribe(txns => transactions=txns);
return of(transactions.find(txn => txn.id === id));

Но это вызывает ошибку, говорящую, что «транзакция» не определена.Я очень плохо знаком с Angular и т. Д., Поэтому любая инструкция полезна.Спасибо!

Stackblitz

Я использую:
Угловой CLI: 6.0.3
Угловой: 6.0.1
rxjs: 6.10,0

1 Ответ

0 голосов
/ 21 мая 2018

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

getTransaction(id: number): Observable<Transaction>{
    return this.getTransactions().pipe(
        map(txs => txs.find(txn => txn.id === id))
    );
}

То, что вы делаете здесь, - это сопоставление каждого массива в вашем потоке с любым элементом, имеющим идентификатор, соответствующий параметру.

...