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