Sync observables created from a synchronous source will emit values synchronously, so the observers will receive values in the order of subscription.
The source iterable is traversed for each observer subscribed. For example, the size of source iterable is M, there are N observers, so the traversal times is M*N. This is explained in RxJS5 Manual:
Plain Observables are unicast (each subscribed Observer owns an independent execution of the Observable)
let sub = Rx.Observable.range(0, 3);
sub.subscribe(value => console.log(`observer 1: ${value}`));
sub.subscribe(value => console.log(`observer 2: ${value}`));
// =>
// observer 1: 0
// observer 1: 1
// observer 1: 2
// observer 2: 0
// observer 2: 1
// observer 2: 1
Async observable emits values over time, so each time a value is emitted, all observers subscribed will react to the emitted value.
let sub = Rx.Observable.interval(200).take(3); // emit 0, 1, 2 every 200ms
sub.subscribe(value => console.log(`observer 1: ${value}`));
sub.subscribe(value => console.log(`observer 2: ${value}`));
// =>
// observer 1: 0
// observer 2: 0
// observer 1: 1
// observer 2: 1
// observer 1: 2
// observer 2: 2