Skip to content

Commit 950499d

Browse files
Fix map() (#1271)
1 parent f2159b9 commit 950499d

File tree

4 files changed

+82
-7
lines changed

4 files changed

+82
-7
lines changed

packages/firestore/src/local/persistence_promise.ts

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,15 +200,31 @@ export class PersistencePromise<T> {
200200

201201
static map<R>(all: Iterable<PersistencePromise<R>>): PersistencePromise<R[]> {
202202
const results: R[] = [];
203-
return PersistencePromise.forEach(all, result => {
204-
results.push(result);
205-
return PersistencePromise.resolve();
206-
}).next(() => results);
203+
const promises: Array<PersistencePromise<void>> = [];
204+
205+
const it = all[Symbol.iterator]();
206+
let result = it.next();
207+
let count = 0;
208+
while (!result.done) {
209+
const value = result.value;
210+
const index = count;
211+
212+
promises.push(
213+
value.next(val => {
214+
results[index] = val;
215+
})
216+
);
217+
218+
result = it.next();
219+
++count;
220+
}
221+
222+
return PersistencePromise.waitFor(promises).next(() => results);
207223
}
208224

209225
static forEach<T>(
210226
all: Iterable<T>,
211-
callback: (T) => PersistencePromise<void>
227+
callback: (elem: T) => PersistencePromise<void>
212228
): PersistencePromise<void> {
213229
const it = all[Symbol.iterator]();
214230

packages/firestore/test/unit/local/indexeddb_persistence.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ describe('IndexedDbSchema: createOrUpgradeDb', () => {
416416
return PersistencePromise.forEach(testMutation.mutations, write => {
417417
const indexKey = DbDocumentMutation.key(
418418
testMutation.userId,
419-
path(write.update.name, 5),
419+
path(write.update!.name!, 5),
420420
testMutation.batchId
421421
);
422422
return documentMutationStore.put(

packages/firestore/test/unit/local/persistence_promise.test.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@
1616

1717
import { expect } from 'chai';
1818
import { PersistencePromise } from '../../../src/local/persistence_promise';
19+
import { Deferred } from '../../../src/util/promise';
20+
21+
import * as chai from 'chai';
22+
import * as chaiAsPromised from 'chai-as-promised';
23+
24+
chai.use(chaiAsPromised);
1925

2026
describe('PersistencePromise', () => {
2127
function async<R>(value: R): PersistencePromise<R> {
@@ -214,6 +220,17 @@ describe('PersistencePromise', () => {
214220
.toPromise();
215221
});
216222

223+
it('propagates error for waitFor()', () => {
224+
const resolved = PersistencePromise.resolve('resolved');
225+
const rejected: PersistencePromise<string> = PersistencePromise.reject(
226+
new Error('rejected')
227+
);
228+
229+
const p = PersistencePromise.waitFor([resolved, rejected]).toPromise();
230+
231+
return expect(p).to.be.eventually.rejectedWith('rejected');
232+
});
233+
217234
it('executes forEach in order', async () => {
218235
let result = '';
219236
await PersistencePromise.forEach(['a', 'b', 'c'], el => {
@@ -222,4 +239,46 @@ describe('PersistencePromise', () => {
222239
}).toPromise();
223240
expect(result).to.equal('abc');
224241
});
242+
243+
it('propagates error for forEach()', () => {
244+
const p = PersistencePromise.forEach([true, false], success => {
245+
if (success) {
246+
return PersistencePromise.resolve();
247+
} else {
248+
return PersistencePromise.reject(new Error('rejected'));
249+
}
250+
}).toPromise();
251+
252+
return expect(p).to.be.eventually.rejectedWith('rejected');
253+
});
254+
255+
it('maintains order for map()', async () => {
256+
const deferred = new Deferred<void>();
257+
258+
const pending = new PersistencePromise<string>(resolve => {
259+
return deferred.promise.then(() => resolve('first'));
260+
});
261+
const resolved = PersistencePromise.resolve('second');
262+
263+
const p = PersistencePromise.map([pending, resolved]).next(results => {
264+
expect(results).to.deep.eq(['first', 'second']);
265+
return PersistencePromise.resolve();
266+
});
267+
268+
setImmediate(() => {
269+
deferred.resolve();
270+
});
271+
272+
await p.toPromise();
273+
});
274+
275+
it('propagates error for map()', () => {
276+
const resolved = PersistencePromise.resolve('resolved');
277+
const rejected: PersistencePromise<string> = PersistencePromise.reject(
278+
new Error('rejected')
279+
);
280+
281+
const p = PersistencePromise.map([resolved, rejected]).toPromise();
282+
return expect(p).to.be.eventually.rejectedWith('rejected');
283+
});
225284
});

packages/firestore/test/unit/local/simple_db.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ describe('SimpleDb', () => {
488488
for (let i = 0; i < 1000; ++i) {
489489
promises.push(store.get(i));
490490
}
491-
return PersistencePromise.map(promises).next(() => {
491+
return PersistencePromise.waitFor(promises).next(() => {
492492
const end = new Date().getTime();
493493
// tslint:disable-next-line:no-console
494494
console.log(`Reading: ${end - start} ms`);

0 commit comments

Comments
 (0)