Skip to content

Commit 1daa6ef

Browse files
committed
Handle sync errors in forEachSeries()
1 parent 9503367 commit 1daa6ef

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

lib/promises.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ function forEachSeries(array, func) {
6262
return array.reduce(
6363
function(promise, element) {
6464
return promise.then(function() {
65-
return func(element);
65+
return attempt(function() {
66+
return func(element);
67+
});
6668
});
6769
},
6870
Promise.resolve()

test/promises.tests.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,66 @@ test("forEachSeries", {
101101
["end", 3]
102102
]);
103103
});
104+
},
105+
106+
"processing stops on sync error": function() {
107+
var log = [];
108+
109+
return promises.forEachSeries([1, 2, 3], function(element) {
110+
return new Promise(function(resolve) {
111+
log.push(["start", element]);
112+
if (element === 2) {
113+
throw new Error("failure");
114+
} else {
115+
setTimeout(function() {
116+
log.push(["end", element]);
117+
resolve(element * 2);
118+
}, 0);
119+
}
120+
});
121+
}).then(
122+
function() {
123+
assert.fail("Expected rejection");
124+
},
125+
function(error) {
126+
assert.strictEqual(error.message, "failure");
127+
assert.deepStrictEqual(log, [
128+
["start", 1],
129+
["end", 1],
130+
["start", 2]
131+
]);
132+
}
133+
);
134+
},
135+
136+
"processing stops on async error": function() {
137+
var log = [];
138+
139+
return promises.forEachSeries([1, 2, 3], function(element) {
140+
return new Promise(function(resolve, reject) {
141+
log.push(["start", element]);
142+
setTimeout(function() {
143+
if (element === 2) {
144+
reject(new Error("failure"));
145+
} else {
146+
log.push(["end", element]);
147+
resolve(element * 2);
148+
}
149+
}, 0);
150+
});
151+
}).then(
152+
function() {
153+
assert.fail("Expected rejection");
154+
},
155+
function(error) {
156+
assert.strictEqual(error.message, "failure");
157+
assert.deepStrictEqual(log, [
158+
["start", 1],
159+
["end", 1],
160+
["start", 2]
161+
]);
162+
}
163+
);
104164
}
105165
});
106166

0 commit comments

Comments
 (0)