|
29 | 29 | clearCaughtError,
|
30 | 30 | } = require('ReactErrorUtils');
|
31 | 31 |
|
32 |
| -var { |
33 |
| - Placement, |
34 |
| - Update, |
35 |
| - Callback, |
36 |
| - ContentReset, |
37 |
| -} = require('ReactTypeOfSideEffect'); |
| 32 | +var {Placement, Update, ContentReset} = require('ReactTypeOfSideEffect'); |
38 | 33 |
|
39 | 34 | var invariant = require('fbjs/lib/invariant');
|
40 | 35 |
|
@@ -487,16 +482,26 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
|
487 | 482 | }
|
488 | 483 | }
|
489 | 484 |
|
490 |
| - function commitCallbacks(callbackList, context) { |
491 |
| - for (let i = 0; i < callbackList.length; i++) { |
492 |
| - const callback = callbackList[i]; |
| 485 | + function commitCallbacks(updateQueue, context) { |
| 486 | + let callbackNode = updateQueue.firstCallback; |
| 487 | + // Reset the callback list before calling them in case something throws. |
| 488 | + updateQueue.firstCallback = updateQueue.lastCallback = null; |
| 489 | + |
| 490 | + while (callbackNode !== null) { |
| 491 | + const callback = callbackNode.callback; |
| 492 | + // Remove this callback from the update object in case it's still part |
| 493 | + // of the queue, so that we don't call it again. |
| 494 | + callbackNode.callback = null; |
493 | 495 | invariant(
|
494 | 496 | typeof callback === 'function',
|
495 | 497 | 'Invalid argument passed as callback. Expected a function. Instead ' +
|
496 | 498 | 'received: %s',
|
497 | 499 | callback,
|
498 | 500 | );
|
499 | 501 | callback.call(context);
|
| 502 | + const nextCallback = callbackNode.nextCallback; |
| 503 | + callbackNode.nextCallback = null; |
| 504 | + callbackNode = nextCallback; |
500 | 505 | }
|
501 | 506 | }
|
502 | 507 |
|
@@ -529,31 +534,19 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
|
529 | 534 | }
|
530 | 535 | }
|
531 | 536 | }
|
532 |
| - if ( |
533 |
| - finishedWork.effectTag & Callback && |
534 |
| - finishedWork.updateQueue !== null |
535 |
| - ) { |
536 |
| - const updateQueue = finishedWork.updateQueue; |
537 |
| - if (updateQueue.callbackList !== null) { |
538 |
| - // Set the list to null to make sure they don't get called more than once. |
539 |
| - const callbackList = updateQueue.callbackList; |
540 |
| - updateQueue.callbackList = null; |
541 |
| - commitCallbacks(callbackList, instance); |
542 |
| - } |
| 537 | + const updateQueue = finishedWork.updateQueue; |
| 538 | + if (updateQueue !== null) { |
| 539 | + commitCallbacks(updateQueue, instance); |
543 | 540 | }
|
544 | 541 | return;
|
545 | 542 | }
|
546 | 543 | case HostRoot: {
|
547 | 544 | const updateQueue = finishedWork.updateQueue;
|
548 |
| - if (updateQueue !== null && updateQueue.callbackList !== null) { |
549 |
| - // Set the list to null to make sure they don't get called more |
550 |
| - // than once. |
551 |
| - const callbackList = updateQueue.callbackList; |
552 |
| - updateQueue.callbackList = null; |
| 545 | + if (updateQueue !== null) { |
553 | 546 | const instance = finishedWork.child !== null
|
554 | 547 | ? finishedWork.child.stateNode
|
555 | 548 | : null;
|
556 |
| - commitCallbacks(callbackList, instance); |
| 549 | + commitCallbacks(updateQueue, instance); |
557 | 550 | }
|
558 | 551 | return;
|
559 | 552 | }
|
|
0 commit comments