Skip to content
This repository has been archived by the owner on Jan 22, 2025. It is now read-only.

Commit

Permalink
Merge pull request #813 from ivanetchart/change_any_behavior
Browse files Browse the repository at this point in the history
Avoid .any not rejecting when promises reject with no value
  • Loading branch information
jbunton-atlassian authored Jun 1, 2017
2 parents 4fecabe + 9175f60 commit 1f04d5d
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 10 deletions.
9 changes: 6 additions & 3 deletions q.js
Original file line number Diff line number Diff line change
Expand Up @@ -1645,9 +1645,12 @@ function any(promises) {
function onRejected(err) {
pendingCount--;
if (pendingCount === 0) {
err.message = ("Q can't get fulfillment value from any promise, all " +
"promises were rejected. Last error message: " + err.message);
deferred.reject(err);
var rejection = err || new Error("" + err);

rejection.message = ("Q can't get fulfillment value from any promise, all " +
"promises were rejected. Last error message: " + rejection.message);

deferred.reject(rejection);
}
}
function onProgress(progress) {
Expand Down
35 changes: 28 additions & 7 deletions spec/q-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1192,7 +1192,7 @@ describe("any", function() {
var deferreds = [Q.defer(), Q.defer()];
var promises = [deferreds[0].promise, deferreds[1].promise];

return testReject(promises, deferreds);
return testReject(promises, deferreds, new Error("Rejected"));
});

it("rejects after all promises in a sparse array are rejected", function() {
Expand All @@ -1201,26 +1201,47 @@ describe("any", function() {
promises[0] = deferreds[0].promise;
promises[3] = deferreds[1].promise;

return testReject(promises, deferreds);
return testReject(promises, deferreds, new Error("Rejected"));
});

function testReject(promises, deferreds) {

it("rejects after all promises are rejected with null", function() {
var deferreds = [Q.defer(), Q.defer()];
var promises = [deferreds[0].promise, deferreds[1].promise];

return testReject(promises, deferreds, null);
});

it("rejects after all promises are rejected with undefined", function() {
var deferreds = [Q.defer(), Q.defer()];
var promises = [deferreds[0].promise, deferreds[1].promise];

return testReject(promises, deferreds, undefined);
});

function testReject(promises, deferreds, rejectionValue) {
var promise = Q.any(promises);
var expectedError = new Error('Rejected');
var expectedError;

if (rejectionValue) {
expectedError = new Error(rejectionValue.message);
} else {
expectedError = new Error("" + rejectionValue);
}

for (var index = 0; index < deferreds.length; index++) {
var deferred = deferreds[index];
(function() {
deferred.reject(expectedError);
deferred.reject(rejectionValue);
})();
}

return Q.delay(250)
.then(function() {
expect(promise.isRejected()).toBe(true);
expect(promise.inspect().reason).toBe(expectedError);
expect(promise.inspect().reason).toEqual(expectedError);
expect(promise.inspect().reason.message)
.toBe("Q can't get fulfillment value from any promise, all promises were rejected. Last error message: Rejected");
.toBe("Q can't get fulfillment value from any promise, all promises were rejected. Last error message: " + expectedError.message);
})
.timeout(1000);
}
Expand Down

0 comments on commit 1f04d5d

Please sign in to comment.