Hi, could you create a Future in your setupRender and use actual results w/ Future.get() during the rendering?
As Chris said I'd also recommend you looking at the ProgressiveDisplay component. On Tue, Apr 14, 2015 at 2:56 PM, Тимур Бухараев <bukhar...@gmail.com> wrote: > I can't call both in setupRender, because i need one blocking wait to > receive all requests in parallel. > > Steps: > 1. prepareData(), all components send their request for data, remember all > requests. > 2. setupRender(), all components gets data from tokens. getData() could be > like this: > Response getData() { > while ( !allRequestsAreRecieved() ) { > Thread.sleep( 10 ); > } > return data; > } > > Now, we if we need 3 data: data1, data2, data3, we dont wait on blocking > calls 3 times one after one. We do one blocking call. So overall delay > would be max( delay1. delay2, delay3), not delay1 + delay2 + delay3 > > On Tue, Apr 14, 2015 at 2:39 PM, Chris Poulsen <mailingl...@nesluop.dk> > wrote: > > > Or maybe you can use progressive display? > > > > > http://jumpstart.doublenegative.com.au/jumpstart7/examples/ajax/progressivedisplayvariations > > > > On Tue, Apr 14, 2015 at 1:36 PM, Chris Poulsen <mailingl...@nesluop.dk> > > wrote: > > > > > If your prepareData() is non-blocking, why not just call it right > before > > > you do the token.getData() ? (both in setupRender() ) > > > > > > On Tue, Apr 14, 2015 at 1:03 PM, Тимур Бухараев <bukhar...@gmail.com> > > > wrote: > > > > > >> Hi, > > >> > > >> My pages consist page class and several components inside. > > >> > > >> Page and its components needs some information from remote services. I > > get > > >> this information with blocking calls in setupRender(). For example, > if i > > >> need user's profile data, i get it like this: > > >> > > >> setupRender() { > > >> profileData = loadProfileDate(); // blocking call, waiting for the > > >> response > > >> } > > >> > > >> And now i can use profileData in render to show some information. > > >> > > >> The problem is page and components need many remote data, so there are > > >> many > > >> serial requests to remote services. It harms latency, because overall > > >> latency is sum of serial requests delays. > > >> > > >> I have idea to improve latency, sending requests in parallel. I want > > make > > >> non blocking function sendRequest, which returns me token. All > > components > > >> call non blocking sendRequest for remote data, then i'll wait in > > blocking > > >> call waitResponses(), which wait for all responses.Then component get > > >> their > > >> data from token. > > >> > > >> Some code for illustration: > > >> > > >> MyComponent { > > >> @Inject > > >> private RemoteService remoteService; > > >> > > >> private Token<Response> token; > > >> } > > >> > > >> void prepareData() { > > >> token = remoteService.sendRequest(); // non blocking call > > >> } > > >> > > >> void setupRender() { > > >> Response response = token.getData(); // first call is blocking, > wait > > >> for all responses, other calls just return data; > > >> } > > >> > > >> Why i did not just realize my idea and write this post? > > >> > > >> Because i need two separate phases: first for send request, and second > > for > > >> prepare rendering. All componets should send in first phase, and after > > get > > >> data in second. > > >> > > >> Tapestry have setupRender and beginRender, but they have another > order. > > It > > >> call setupRender and beginRender for first component, and then - for > > >> second. But i need phase 1 calls for all components, then phase 2 call > > for > > >> all components. > > >> > > >> And now my question is: is there any way in Tapestry to create this > > >> phases? > > >> Thank you for your attention, sorry for my English. > > >> > > > > > > > > > -- Dmitry Gusev AnjLab Team http://anjlab.com