|
340 | 340 | function _tickCallback() {
|
341 | 341 | var callback, threw, tock;
|
342 | 342 |
|
343 |
| - scheduleMicrotasks(); |
344 |
| - |
345 |
| - while (tickInfo[kIndex] < tickInfo[kLength]) { |
346 |
| - tock = nextTickQueue[tickInfo[kIndex]++]; |
347 |
| - callback = tock.callback; |
348 |
| - threw = true; |
349 |
| - try { |
350 |
| - callback(); |
351 |
| - threw = false; |
352 |
| - } finally { |
353 |
| - if (threw) |
| 343 | + do { |
| 344 | + while (tickInfo[kIndex] < tickInfo[kLength]) { |
| 345 | + tock = nextTickQueue[tickInfo[kIndex]++]; |
| 346 | + callback = tock.callback; |
| 347 | + threw = true; |
| 348 | + try { |
| 349 | + callback(); |
| 350 | + threw = false; |
| 351 | + } finally { |
| 352 | + if (threw) |
| 353 | + tickDone(); |
| 354 | + } |
| 355 | + if (1e4 < tickInfo[kIndex]) |
354 | 356 | tickDone();
|
355 | 357 | }
|
356 |
| - if (1e4 < tickInfo[kIndex]) |
357 |
| - tickDone(); |
358 |
| - } |
359 |
| - |
360 |
| - tickDone(); |
| 358 | + tickDone(); |
| 359 | + _runMicrotasks(); |
| 360 | + emitPendingUnhandledRejections(); |
| 361 | + } while (tickInfo[kLength] !== 0); |
361 | 362 | }
|
362 | 363 |
|
363 | 364 | function _tickDomainCallback() {
|
364 | 365 | var callback, domain, threw, tock;
|
365 | 366 |
|
366 |
| - scheduleMicrotasks(); |
367 |
| - |
368 |
| - while (tickInfo[kIndex] < tickInfo[kLength]) { |
369 |
| - tock = nextTickQueue[tickInfo[kIndex]++]; |
370 |
| - callback = tock.callback; |
371 |
| - domain = tock.domain; |
372 |
| - if (domain) |
373 |
| - domain.enter(); |
374 |
| - threw = true; |
375 |
| - try { |
376 |
| - callback(); |
377 |
| - threw = false; |
378 |
| - } finally { |
379 |
| - if (threw) |
| 367 | + do { |
| 368 | + while (tickInfo[kIndex] < tickInfo[kLength]) { |
| 369 | + tock = nextTickQueue[tickInfo[kIndex]++]; |
| 370 | + callback = tock.callback; |
| 371 | + domain = tock.domain; |
| 372 | + if (domain) |
| 373 | + domain.enter(); |
| 374 | + threw = true; |
| 375 | + try { |
| 376 | + callback(); |
| 377 | + threw = false; |
| 378 | + } finally { |
| 379 | + if (threw) |
| 380 | + tickDone(); |
| 381 | + } |
| 382 | + if (1e4 < tickInfo[kIndex]) |
380 | 383 | tickDone();
|
| 384 | + if (domain) |
| 385 | + domain.exit(); |
381 | 386 | }
|
382 |
| - if (1e4 < tickInfo[kIndex]) |
383 |
| - tickDone(); |
384 |
| - if (domain) |
385 |
| - domain.exit(); |
386 |
| - } |
| 387 | + tickDone(); |
| 388 | + _runMicrotasks(); |
| 389 | + emitPendingUnhandledRejections(); |
| 390 | + } while (tickInfo[kLength] !== 0); |
| 391 | + } |
387 | 392 |
|
388 |
| - tickDone(); |
| 393 | + function TickObject(c) { |
| 394 | + this.callback = c; |
| 395 | + this.domain = process.domain || null; |
389 | 396 | }
|
390 | 397 |
|
391 | 398 | function nextTick(callback) {
|
392 | 399 | // on the way out, don't bother. it won't get fired anyway.
|
393 | 400 | if (process._exiting)
|
394 | 401 | return;
|
395 | 402 |
|
396 |
| - var obj = { |
397 |
| - callback: callback, |
398 |
| - domain: process.domain || null |
399 |
| - }; |
400 |
| - |
401 |
| - nextTickQueue.push(obj); |
| 403 | + nextTickQueue.push(new TickObject(callback)); |
402 | 404 | tickInfo[kLength]++;
|
403 | 405 | }
|
404 | 406 |
|
|
0 commit comments