To manage the delay, I take a 'lazy' approach to displaying the price on screen.
When I create my in app purchase menu, I leave all of the text objects that will display the product price as empty strings.
Then, when the menu is finally displayed on screen, I check at the moment before everything is made visible whether iap.getLoadProductsCatalogue() has returned any values from the app store yet. If it has, I copy in the localised price. If it hasn't, I leave the text blank and fall back on iOS/Android displaying the price when the user clicks 'purchase'.
An event driven way to do this would be to pass a listener function to iap.loadProducts(). When the listener is triggered, get your function to fill in prices into all the relevant text objects.
In practice, it's going to be several seconds between calling iap.loadProducts() and getting the results, even over a mobile network. With this approach, if you call iap.loadProducts() as early in your app execution as possible, by the time the user has seen your splash screen and navigated your menu system, the prices are likely to be ready for you.