Skip to content

Commit 08abe63

Browse files
committed
Merge pull request #115 from braker1nine/when_return_array
Make sure `when` argument corresponds with `then` arguments
2 parents b3356b2 + 56cc190 commit 08abe63

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

src/ParsePromise.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,8 @@ export default class ParsePromise {
346346
*/
347347
static when(promises) {
348348
var objects;
349-
if (Array.isArray(promises)) {
349+
var arrayArgument = Array.isArray(promises);
350+
if (arrayArgument) {
350351
objects = promises;
351352
} else {
352353
objects = arguments;
@@ -355,12 +356,13 @@ export default class ParsePromise {
355356
var total = objects.length;
356357
var hadError = false;
357358
var results = [];
359+
var returnValue = arrayArgument ? [results] : results;
358360
var errors = [];
359361
results.length = objects.length;
360362
errors.length = objects.length;
361363

362364
if (total === 0) {
363-
return ParsePromise.as.apply(this, results);
365+
return ParsePromise.as.apply(this, returnValue);
364366
}
365367

366368
var promise = new ParsePromise();
@@ -371,7 +373,7 @@ export default class ParsePromise {
371373
if (hadError) {
372374
promise.reject(errors);
373375
} else {
374-
promise.resolve.apply(promise, results);
376+
promise.resolve.apply(promise, returnValue);
375377
}
376378
}
377379
};

src/__tests__/ParsePromise-test.js

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ describe('Promise', () => {
227227
jest.runAllTimers();
228228
}));
229229

230-
it('can handle promises in parallel', asyncHelper(function(done) {
230+
it('can handle promises in parallel with array', asyncHelper(function(done) {
231231
var COUNT = 5;
232232

233233
var delay = function(ms) {
@@ -249,7 +249,42 @@ describe('Promise', () => {
249249
generate(i);
250250
}
251251

252-
ParsePromise.when(promises).then(function() {
252+
ParsePromise.when(promises).then(function(results) {
253+
expect(called).toBe(COUNT);
254+
expect(COUNT).toBe(results.length);
255+
var actual = results;
256+
for (var i = 0; i < actual.length; i++) {
257+
expect(actual[i]).toBe(5 * i);
258+
}
259+
done();
260+
});
261+
262+
jest.runAllTimers();
263+
}));
264+
265+
it('can handle promises in parallel with arguments', asyncHelper(function(done) {
266+
var COUNT = 5;
267+
268+
var delay = function(ms) {
269+
var promise = new ParsePromise();
270+
setTimeout(() => { promise.resolve(); }, ms);
271+
return promise;
272+
};
273+
274+
var called = 0;
275+
var promises = [];
276+
function generate(i) {
277+
promises[i] = delay((i % 2) ? (i * 10) : (COUNT * 10) - (i * 10)).then(
278+
function() {
279+
called++;
280+
return 5 * i;
281+
});
282+
}
283+
for (var i = 0; i < COUNT; i++) {
284+
generate(i);
285+
}
286+
287+
ParsePromise.when.apply(null, promises).then(function() {
253288
expect(called).toBe(COUNT);
254289
expect(COUNT).toBe(arguments.length);
255290
var actual = arguments;

0 commit comments

Comments
 (0)