|
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