Оператор RxJS combineAll, пояснение
Я пытаюсь понять, как combineAll работы оператора.
Я использую следующий пример из официальной документации:
const source = Rx.Observable.interval(1000).take(2);
const example = source.map(val => Rx.Observable.interval(1000).map(i => `Result (${val}): ${i}`).take(5));
const combined = example.combineAll();
Выход тогда :
["Result (0): 0", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 1", "Result (1): 1"]
["Result (0): 2", "Result (1): 1"]
["Result (0): 2", "Result (1): 2"]
["Result (0): 3", "Result (1): 2"]
["Result (0): 3", "Result (1): 3"]
["Result (0): 4", "Result (1): 3"]
["Result (0): 4", "Result (1): 4"]
Пытаясь понять, почему, я сделал эту простую схему:
Из документации я прочитал, что каждый раз, когда какой-либо из внутренних наблюдаемых излучает значение, то это излучаемое значение объединяется с последним значением всех других внутренних наблюдаемых.
В схеме выше мы видим, что 10 значений излучаются во времени внутренними наблюдаемыми, поэтому я ожидал получить результат с 10 значениями за это время, но это 9.
Также в первой строке вывода :
["Result (0): 0", "Result (1): 0"])
Соответствует ли 0 'Result (1): 0' нулевому значению? Потому что наблюдаемый "внутренний 2" еще ничего не испустил?
Чтобы закончить здесь то, что я ожидал в качестве вывода:
["Result (0): 0", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 2", "Result (1): 0"]
["Result (0): 2", "Result (1): 1"]
["Result (0): 3", "Result (1): 1"]
["Result (0): 3", "Result (1): 2"]
["Result (0): 4", "Result (1): 2"]
["Result (0): 4", "Result (1): 3"]
["Result (0): 4", "Result (1): 4"]
Это очевидно неправильно, но я не нахожу свою ошибку, может кто-то объяснить?
1 ответ:
Учтите, что
combineAll:Выравнивает наблюдаемое из наблюдаемых, применяя
combineLatest, когда наблюдаемое из наблюдаемых завершается.И что
combineLatest;Таким образом, первое излучение из наблюдаемого объекта, включающее первое значение наблюдаемого объекта "внутренний 1", не произойдет до тех пор, пока наблюдаемый объект "внутренний 2" не испустит свое первое значение. Так будет только девять выбросов, а не десять.Фактически будет ждать, пока все входные наблюдаемые объекты испустят хотя бы один раз.

Comments