ASsume we have `observableA` and `observableB`. Assume `observableA` and `observableB` already emitted a value so `zip` emits value. Now if `observableB `**emitted again** but `observableA` did not then `zip` does emit value. Because `zip` waits for `observableA` to **emit again**. In comparison, `combineLatest` would emit value with new `observableB` value and old `observableA` value .
Interesting Example.
```
// https://www.learnrxjs.io/learn-rxjs/operators/combination/zip
import { fromEvent, zip } from 'rxjs';
import { map } from 'rxjs/operators';
const eventTime = eventName =>
fromEvent(document, eventName).pipe(map(() => new Date()));
const mouseClickDuration = zip(
eventTime('mousedown'),
eventTime('mouseup')
).pipe(map(([start, end]) => Math.abs(start.getTime() - end.getTime())));
```
We have `mousedown`and `mouseup`. Assume `mousedown`and `mouseup`already emitted a value so `zip` emits value. Now if `mouseup` **emitted again** but `mousedown`did not then `zip` **does emit valu**e. Because `zip` waits for `mousedown`to **emit again**. In comparison, `combineLatest` would emit value with new `observableB` value and old `mousedown`value .
We have `observableA` and `observableB`. Assume `observableA` and `observableB` already emitted a value so `zip` emits value. Now if `observableB `**emitted again** but `observableA` did not then `zip` does emit value. Because `zip` waits for `observableA` to **emit again**. In comparison, `combineLatest` would emit value with new `observableB` value and old `observableA` value .
Interesting Example.
```
// https://www.learnrxjs.io/learn-rxjs/operators/combination/zip
import { fromEvent, zip } from 'rxjs';
import { map } from 'rxjs/operators';
const eventTime = eventName =>
fromEvent(document, eventName).pipe(map(() => new Date()));
const mouseClickDuration = zip(
eventTime('mousedown'),
eventTime('mouseup')
).pipe(map(([start, end]) => Math.abs(start.getTime() - end.getTime())));
```
We have `mousedown`and `mouseup`. Assume `mousedown`and `mouseup`already emitted a value so `zip` emits value. Now if `mouseup` **emitted again** but `mousedown`did not then `zip` **does emit valu**e. Because `zip` waits for `mousedown`to **emit again**. In comparison, `combineLatest` would emit value with new `observableB` value and old `mousedown`value .