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