Skip to content

Commit ccfee38

Browse files
committed
Add PromiseUtils.waitForAll
Add a utility that always waits for all promises, even if one fails. (`$q.all` returns immediately when one fails.)
1 parent e4484f3 commit ccfee38

File tree

4 files changed

+179
-0
lines changed

4 files changed

+179
-0
lines changed

dist/origin-web-common-services.js

+54
Original file line numberDiff line numberDiff line change
@@ -3272,6 +3272,60 @@ angular.module('openshiftCommonServices')
32723272
});
32733273
;'use strict';
32743274

3275+
angular.module('openshiftCommonServices')
3276+
.factory('PromiseUtils', function($q) {
3277+
return {
3278+
// Returns a promise that is resolved or rejected only after all promises
3279+
// complete. `promises` is a collection of promises. `null` or
3280+
// `undefined` values are treated as "complete."
3281+
//
3282+
// Different than `$q.all` in that it will always wait for all promises.
3283+
// `$q.all` short circuits as soon as one fails.
3284+
//
3285+
// Also unlike `$q.all`, this method does not return any values when
3286+
// resolving or reasons when rejecting the promise.
3287+
waitForAll: function(promises) {
3288+
var total = _.size(promises);
3289+
if (!total) {
3290+
return $q.when();
3291+
}
3292+
3293+
var deferred = $q.defer();
3294+
var complete = 0;
3295+
var failed = false;
3296+
var checkDone = function() {
3297+
if (complete < total) {
3298+
return;
3299+
}
3300+
3301+
if (failed) {
3302+
deferred.reject();
3303+
} else {
3304+
deferred.resolve();
3305+
}
3306+
};
3307+
3308+
_.each(promises, function(promise) {
3309+
if (!promise) {
3310+
complete++;
3311+
checkDone();
3312+
return;
3313+
}
3314+
3315+
promise.catch(function() {
3316+
failed = true;
3317+
}).finally(function() {
3318+
complete++;
3319+
checkDone();
3320+
});
3321+
});
3322+
3323+
return deferred.promise;
3324+
}
3325+
};
3326+
});
3327+
;'use strict';
3328+
32753329
angular.module("openshiftCommonServices")
32763330
.service("RecentlyViewedProjectsService", function($filter){
32773331

dist/origin-web-common.js

+54
Original file line numberDiff line numberDiff line change
@@ -5296,6 +5296,60 @@ angular.module('openshiftCommonServices')
52965296
}]);
52975297
;'use strict';
52985298

5299+
angular.module('openshiftCommonServices')
5300+
.factory('PromiseUtils', ["$q", function($q) {
5301+
return {
5302+
// Returns a promise that is resolved or rejected only after all promises
5303+
// complete. `promises` is a collection of promises. `null` or
5304+
// `undefined` values are treated as "complete."
5305+
//
5306+
// Different than `$q.all` in that it will always wait for all promises.
5307+
// `$q.all` short circuits as soon as one fails.
5308+
//
5309+
// Also unlike `$q.all`, this method does not return any values when
5310+
// resolving or reasons when rejecting the promise.
5311+
waitForAll: function(promises) {
5312+
var total = _.size(promises);
5313+
if (!total) {
5314+
return $q.when();
5315+
}
5316+
5317+
var deferred = $q.defer();
5318+
var complete = 0;
5319+
var failed = false;
5320+
var checkDone = function() {
5321+
if (complete < total) {
5322+
return;
5323+
}
5324+
5325+
if (failed) {
5326+
deferred.reject();
5327+
} else {
5328+
deferred.resolve();
5329+
}
5330+
};
5331+
5332+
_.each(promises, function(promise) {
5333+
if (!promise) {
5334+
complete++;
5335+
checkDone();
5336+
return;
5337+
}
5338+
5339+
promise.catch(function() {
5340+
failed = true;
5341+
}).finally(function() {
5342+
complete++;
5343+
checkDone();
5344+
});
5345+
});
5346+
5347+
return deferred.promise;
5348+
}
5349+
};
5350+
}]);
5351+
;'use strict';
5352+
52995353
angular.module("openshiftCommonServices")
53005354
.service("RecentlyViewedProjectsService", ["$filter", function($filter){
53015355

dist/origin-web-common.min.js

+17
Original file line numberDiff line numberDiff line change
@@ -2343,6 +2343,23 @@ return cachedProjectData && cachedProjectData.update(project, "DELETED"), delete
23432343
});
23442344
}
23452345
};
2346+
} ]), angular.module("openshiftCommonServices").factory("PromiseUtils", [ "$q", function($q) {
2347+
return {
2348+
waitForAll:function(promises) {
2349+
var total = _.size(promises);
2350+
if (!total) return $q.when();
2351+
var deferred = $q.defer(), complete = 0, failed = !1, checkDone = function() {
2352+
total > complete || (failed ? deferred.reject() :deferred.resolve());
2353+
};
2354+
return _.each(promises, function(promise) {
2355+
return promise ? void promise["catch"](function() {
2356+
failed = !0;
2357+
})["finally"](function() {
2358+
complete++, checkDone();
2359+
}) :(complete++, void checkDone());
2360+
}), deferred.promise;
2361+
}
2362+
};
23462363
} ]), angular.module("openshiftCommonServices").service("RecentlyViewedProjectsService", [ "$filter", function($filter) {
23472364
var recentlyViewedProjsKey = "openshift/recently-viewed-project-uids", getProjectUIDs = function() {
23482365
var recentlyViewed = localStorage.getItem(recentlyViewedProjsKey);

src/services/promiseUtilsService.js

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
'use strict';
2+
3+
angular.module('openshiftCommonServices')
4+
.factory('PromiseUtils', function($q) {
5+
return {
6+
// Returns a promise that is resolved or rejected only after all promises
7+
// complete. `promises` is a collection of promises. `null` or
8+
// `undefined` values are treated as "complete."
9+
//
10+
// Different than `$q.all` in that it will always wait for all promises.
11+
// `$q.all` short circuits as soon as one fails.
12+
//
13+
// Also unlike `$q.all`, this method does not return any values when
14+
// resolving or reasons when rejecting the promise.
15+
waitForAll: function(promises) {
16+
var total = _.size(promises);
17+
if (!total) {
18+
return $q.when();
19+
}
20+
21+
var deferred = $q.defer();
22+
var complete = 0;
23+
var failed = false;
24+
var checkDone = function() {
25+
if (complete < total) {
26+
return;
27+
}
28+
29+
if (failed) {
30+
deferred.reject();
31+
} else {
32+
deferred.resolve();
33+
}
34+
};
35+
36+
_.each(promises, function(promise) {
37+
if (!promise) {
38+
complete++;
39+
checkDone();
40+
return;
41+
}
42+
43+
promise.catch(function() {
44+
failed = true;
45+
}).finally(function() {
46+
complete++;
47+
checkDone();
48+
});
49+
});
50+
51+
return deferred.promise;
52+
}
53+
};
54+
});

0 commit comments

Comments
 (0)