Skip to content

Commit ee36617

Browse files
committed
Merge branch 'blackrabbit99-master'
2 parents d7ee924 + 38c3a1f commit ee36617

File tree

4 files changed

+292
-41
lines changed

4 files changed

+292
-41
lines changed

lib/parallel.js

Lines changed: 71 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
this._result = err;
3838

3939
for (var iE = 0; iE < this._errCallbacks.length; ++iE) {
40-
this._errCallbacks[iE](res);
40+
this._errCallbacks[iE](err);
4141
}
4242
}
4343

@@ -87,8 +87,8 @@
8787
}
8888

8989
// static method
90-
Parallel.isSupported=function(){ return _supports; }
91-
90+
Parallel.isSupported = function () { return _supports; }
91+
9292
Parallel.prototype.getWorkerSource = function (cb, env) {
9393
var that = this;
9494
var preStr = '';
@@ -189,11 +189,19 @@
189189
that.data = msg.data;
190190
newOp.resolve(null, that.data);
191191
};
192+
wrk.onerror = function (e) {
193+
wrk.terminate();
194+
newOp.resolve(e, null);
195+
};
192196
wrk.postMessage(that.data);
193197
} else if (that.options.synchronous) {
194198
setImmediate(function () {
195-
that.data = cb(that.data);
196-
newOp.resolve(null, that.data);
199+
try {
200+
that.data = cb(that.data);
201+
newOp.resolve(null, that.data);
202+
} catch (e) {
203+
newOp.resolve(e, null);
204+
}
197205
});
198206
} else {
199207
throw new Error('Workers do not exist and synchronous operation not allowed!');
@@ -205,13 +213,17 @@
205213

206214
Parallel.prototype._spawnMapWorker = function (i, cb, done, env, wrk) {
207215
var that = this;
208-
216+
209217
if (!wrk) wrk = that._spawnWorker(cb, env);
210-
218+
211219
if (wrk !== undefined) {
212220
wrk.onmessage = function (msg) {
213221
that.data[i] = msg.data;
214-
done(wrk);
222+
done(null, wrk);
223+
};
224+
wrk.onerror = function (e) {
225+
wrk.terminate();
226+
done(e);
215227
};
216228
wrk.postMessage(that.data[i]);
217229
} else if (that.options.synchronous) {
@@ -234,8 +246,10 @@
234246
var that = this;
235247
var startedOps = 0;
236248
var doneOps = 0;
237-
function done(wrk) {
238-
if (++doneOps === that.data.length) {
249+
function done(err, wrk) {
250+
if (err) {
251+
newOp.resolve(err, null);
252+
} else if (++doneOps === that.data.length) {
239253
newOp.resolve(null, that.data);
240254
if (wrk) wrk.terminate();
241255
} else if (startedOps < that.data.length) {
@@ -250,6 +264,8 @@
250264
for (; startedOps - doneOps < that.options.maxWorkers && startedOps < that.data.length; ++startedOps) {
251265
that._spawnMapWorker(startedOps, cb, done, env);
252266
}
267+
}, function (err) {
268+
newOp.resolve(err, null);
253269
});
254270
this.operation = newOp;
255271
return this;
@@ -262,8 +278,12 @@
262278
if (wrk !== undefined) {
263279
wrk.onmessage = function (msg) {
264280
that.data[that.data.length] = msg.data;
265-
done(wrk);
281+
done(null, wrk);
266282
};
283+
wrk.onerror = function (e) {
284+
wrk.terminate();
285+
done(e, null);
286+
}
267287
wrk.postMessage(data);
268288
} else if (that.options.synchronous) {
269289
setImmediate(function () {
@@ -284,9 +304,11 @@
284304

285305
var runningWorkers = 0;
286306
var that = this;
287-
function done(wrk) {
307+
function done(err, wrk) {
288308
--runningWorkers;
289-
if (that.data.length === 1 && runningWorkers === 0) {
309+
if (err) {
310+
newOp.resolve(err, null);
311+
} else if (that.data.length === 1 && runningWorkers === 0) {
290312
that.data = that.data[0];
291313
newOp.resolve(null, that.data);
292314
if (wrk) wrk.terminate();
@@ -304,7 +326,7 @@
304326
if (that.data.length === 1) {
305327
newOp.resolve(null, that.data[0]);
306328
} else {
307-
for (var i = 0; i < that.options.maxWorkers && i < Math.floor(that.data.length / 2); ++i) {
329+
for (var i = 0; i < that.options.maxWorkers && i < Math.floor(that.data.length / 2) ; ++i) {
308330
++runningWorkers;
309331
that._spawnReduceWorker([that.data[i * 2], that.data[i * 2 + 1]], cb, done, env);
310332
}
@@ -319,13 +341,43 @@
319341
Parallel.prototype.then = function (cb, errCb) {
320342
var that = this;
321343
var newOp = new Operation();
344+
errCb = typeof errCb === 'function' ? errCb : function(){};
345+
322346
this.operation.then(function () {
323-
var retData = cb(that.data);
324-
if (retData !== undefined) {
325-
that.data = retData;
347+
var retData;
348+
349+
try {
350+
if (cb) {
351+
retData = cb(that.data);
352+
if (retData !== undefined) {
353+
that.data = retData;
354+
}
355+
}
356+
newOp.resolve(null, that.data);
357+
} catch (e) {
358+
if (errCb) {
359+
retData = errCb(e);
360+
if (retData !== undefined) {
361+
that.data = retData;
362+
}
363+
364+
newOp.resolve(null, that.data);
365+
} else {
366+
newOp.resolve(null, e);
367+
}
326368
}
327-
newOp.resolve(null, that.data);
328-
}, errCb);
369+
}, function (err) {
370+
if (errCb) {
371+
var retData = errCb(err);
372+
if (retData !== undefined) {
373+
that.data = retData;
374+
}
375+
376+
newOp.resolve(null, that.data);
377+
} else {
378+
newOp.resolve(null, err);
379+
}
380+
});
329381
this.operation = newOp;
330382
return this;
331383
};

0 commit comments

Comments
 (0)