|
37 | 37 | this._result = err;
|
38 | 38 |
|
39 | 39 | for (var iE = 0; iE < this._errCallbacks.length; ++iE) {
|
40 |
| - this._errCallbacks[iE](res); |
| 40 | + this._errCallbacks[iE](err); |
41 | 41 | }
|
42 | 42 | }
|
43 | 43 |
|
|
87 | 87 | }
|
88 | 88 |
|
89 | 89 | // static method
|
90 |
| - Parallel.isSupported=function(){ return _supports; } |
91 |
| - |
| 90 | + Parallel.isSupported = function () { return _supports; } |
| 91 | + |
92 | 92 | Parallel.prototype.getWorkerSource = function (cb, env) {
|
93 | 93 | var that = this;
|
94 | 94 | var preStr = '';
|
|
189 | 189 | that.data = msg.data;
|
190 | 190 | newOp.resolve(null, that.data);
|
191 | 191 | };
|
| 192 | + wrk.onerror = function (e) { |
| 193 | + wrk.terminate(); |
| 194 | + newOp.resolve(e, null); |
| 195 | + }; |
192 | 196 | wrk.postMessage(that.data);
|
193 | 197 | } else if (that.options.synchronous) {
|
194 | 198 | 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 | + } |
197 | 205 | });
|
198 | 206 | } else {
|
199 | 207 | throw new Error('Workers do not exist and synchronous operation not allowed!');
|
|
205 | 213 |
|
206 | 214 | Parallel.prototype._spawnMapWorker = function (i, cb, done, env, wrk) {
|
207 | 215 | var that = this;
|
208 |
| - |
| 216 | + |
209 | 217 | if (!wrk) wrk = that._spawnWorker(cb, env);
|
210 |
| - |
| 218 | + |
211 | 219 | if (wrk !== undefined) {
|
212 | 220 | wrk.onmessage = function (msg) {
|
213 | 221 | that.data[i] = msg.data;
|
214 |
| - done(wrk); |
| 222 | + done(null, wrk); |
| 223 | + }; |
| 224 | + wrk.onerror = function (e) { |
| 225 | + wrk.terminate(); |
| 226 | + done(e); |
215 | 227 | };
|
216 | 228 | wrk.postMessage(that.data[i]);
|
217 | 229 | } else if (that.options.synchronous) {
|
|
234 | 246 | var that = this;
|
235 | 247 | var startedOps = 0;
|
236 | 248 | 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) { |
239 | 253 | newOp.resolve(null, that.data);
|
240 | 254 | if (wrk) wrk.terminate();
|
241 | 255 | } else if (startedOps < that.data.length) {
|
|
250 | 264 | for (; startedOps - doneOps < that.options.maxWorkers && startedOps < that.data.length; ++startedOps) {
|
251 | 265 | that._spawnMapWorker(startedOps, cb, done, env);
|
252 | 266 | }
|
| 267 | + }, function (err) { |
| 268 | + newOp.resolve(err, null); |
253 | 269 | });
|
254 | 270 | this.operation = newOp;
|
255 | 271 | return this;
|
|
262 | 278 | if (wrk !== undefined) {
|
263 | 279 | wrk.onmessage = function (msg) {
|
264 | 280 | that.data[that.data.length] = msg.data;
|
265 |
| - done(wrk); |
| 281 | + done(null, wrk); |
266 | 282 | };
|
| 283 | + wrk.onerror = function (e) { |
| 284 | + wrk.terminate(); |
| 285 | + done(e, null); |
| 286 | + } |
267 | 287 | wrk.postMessage(data);
|
268 | 288 | } else if (that.options.synchronous) {
|
269 | 289 | setImmediate(function () {
|
|
284 | 304 |
|
285 | 305 | var runningWorkers = 0;
|
286 | 306 | var that = this;
|
287 |
| - function done(wrk) { |
| 307 | + function done(err, wrk) { |
288 | 308 | --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) { |
290 | 312 | that.data = that.data[0];
|
291 | 313 | newOp.resolve(null, that.data);
|
292 | 314 | if (wrk) wrk.terminate();
|
|
304 | 326 | if (that.data.length === 1) {
|
305 | 327 | newOp.resolve(null, that.data[0]);
|
306 | 328 | } 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) { |
308 | 330 | ++runningWorkers;
|
309 | 331 | that._spawnReduceWorker([that.data[i * 2], that.data[i * 2 + 1]], cb, done, env);
|
310 | 332 | }
|
|
319 | 341 | Parallel.prototype.then = function (cb, errCb) {
|
320 | 342 | var that = this;
|
321 | 343 | var newOp = new Operation();
|
| 344 | + errCb = typeof errCb === 'function' ? errCb : function(){}; |
| 345 | + |
322 | 346 | 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 | + } |
326 | 368 | }
|
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 | + }); |
329 | 381 | this.operation = newOp;
|
330 | 382 | return this;
|
331 | 383 | };
|
|
0 commit comments