Существует множество причин не хранить идентификаторы в списках с разделителями-запятыми:
table
. Иногда мы придерживаемся действительно, действительно, действительно, действительно, действительно, очень плохих решений.
MySQL offset work-around, называемый find_in_set()
:
SELECT i.*
FROM items i JOIN
items_rel ir
ON find_in_set(i.id, ir.ids) > 0;
Однако вы должны приложить свои усилия для фиксации модели данных, а не для того, чтобы запрос работал. Википедия - это одно место для начала.
Вы на самом деле правы здесь. Оператор multicast
действительно возвращает экземпляр ConnectableObservable
( https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/multicast.ts#L54 ). [ 119]
Это просто проблема с типами TypeScript, где pipe()
всегда возвращает только Observable
: ( https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts# L301-L311 ).
Об этом сообщалось, и на странице GitHub RxJS есть открытая проблема: https://github.com/ReactiveX/rxjs/issues/2972
Самый простой обходной путь - принудительное решение переопределить возвращенный Observable
:
const source4$ = interval(1000).pipe(...) as ConnectableObservable<number>
Вы могли обойти его, не используя эти pipe()
функция для соединения оператора как все, что это делает, вызывает функцию, возвращенную multicast()
.
, Например: observable.pipe(take(5))
совпадает с take(5)(observable)
единственная проблема, которая этот путь, TypeScript не сможет вывести тип Заметного. Таким образом, необходимо будет указать его при создании Предмета.
let source4$ = multicast(new Subject<number>())(interval(1000).pipe(take(4)));
source4$.subscribe(val => {
console.log(`Observer 1: ${val}`);
});
setTimeout(function() {
source4$.subscribe(val => {
console.log(`Observer 2: ${val}`);
});
}, 1000);
setTimeout(function() {
source4$.subscribe(val => {
console.log(`Observer 3: ${val}`);
});
}, 2000);
source4$.connect();