main
js 54 lines 1.56 KB
Raw
1 /**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8 // Used as a way to call batchedUpdates when we don't have a reference to
9 // the renderer. Such as when we're dispatching events or if third party
10 // libraries need to call batchedUpdates. Eventually, this API will go away when
11 // everything is batched by default. We'll then have a similar API to opt-out of
12 // scheduled work and instead do synchronous work.
13
14 // Defaults
15 let batchedUpdatesImpl = function (fn, bookkeeping) {
16 return fn(bookkeeping);
17 };
18 let discreteUpdatesImpl = function (fn, a, b, c, d) {
19 return fn(a, b, c, d);
20 };
21
22 let isInsideEventHandler = false;
23
24 export function batchedUpdates(fn, bookkeeping) {
25 if (isInsideEventHandler) {
26 // If we are currently inside another batch, we need to wait until it
27 // fully completes before restoring state.
28 return fn(bookkeeping);
29 }
30 isInsideEventHandler = true;
31 try {
32 return batchedUpdatesImpl(fn, bookkeeping);
33 } finally {
34 isInsideEventHandler = false;
35 }
36 }
37
38 export function discreteUpdates(fn, a, b, c, d) {
39 const prevIsInsideEventHandler = isInsideEventHandler;
40 isInsideEventHandler = true;
41 try {
42 return discreteUpdatesImpl(fn, a, b, c, d);
43 } finally {
44 isInsideEventHandler = prevIsInsideEventHandler;
45 }
46 }
47
48 export function setBatchingImplementation(
49 _batchedUpdatesImpl,
50 _discreteUpdatesImpl,
51 ) {
52 batchedUpdatesImpl = _batchedUpdatesImpl;
53 discreteUpdatesImpl = _discreteUpdatesImpl;
54 }