diff --git a/ReactCommon/react/bridging/Function.h b/ReactCommon/react/bridging/Function.h index 4e90410d5d8..568dd59acba 100644 --- a/ReactCommon/react/bridging/Function.h +++ b/ReactCommon/react/bridging/Function.h @@ -39,38 +39,36 @@ class AsyncCallback { } void call(Args... args) const { - auto wrapper = callback_->wrapper_.lock(); - if (!wrapper) { - throw std::runtime_error("Failed to call invalidated async callback"); - } - - auto argsTuple = std::make_tuple(std::forward(args)...); - - wrapper->jsInvoker().invokeAsync( - [callback = callback_, - argsPtr = std::make_shared( - std::move(argsTuple))] { callback->apply(std::move(*argsPtr)); }); + callInternal(std::nullopt, std::forward(args)...); } void callWithPriority(SchedulerPriority priority, Args... args) const { - auto wrapper = callback_->wrapper_.lock(); - if (!wrapper) { - throw std::runtime_error("Failed to call invalidated async callback"); - } - - auto argsTuple = std::make_tuple(std::forward(args)...); - - wrapper->jsInvoker().invokeAsync( - priority, - [callback = callback_, - argsPtr = std::make_shared( - std::move(argsTuple))] { callback->apply(std::move(*argsPtr)); }); + callInternal(priority, std::forward(args)...); } private: friend Bridging; std::shared_ptr> callback_; + + void callInternal(std::optional priority, Args... args) + const { + auto wrapper = callback_->wrapper_.lock(); + if (!wrapper) { + throw std::runtime_error("Failed to call invalidated async callback"); + } + auto fn = [callback = callback_, + argsPtr = std::make_shared>( + std::make_tuple(std::forward(args)...))] { + callback->apply(std::move(*argsPtr)); + }; + + if (priority) { + wrapper->jsInvoker().invokeAsync(*priority, std::move(fn)); + } else { + wrapper->jsInvoker().invokeAsync(std::move(fn)); + } + } }; template