2017-07-17 51 views
5

注:我是新來發揮框架發揮框架 - 渲染視圖,同時做處理/ X秒後重定向

對於我的發揮!項目,我需要某種形式的異步編程。簡而言之,我需要在後臺進行處理時顯示視圖,然後顯示重定向或新表單。

這個question已被問及沒有迴應。我查看了Play文檔頁面,但沒有找到任何解決方案。

我曾嘗試:

我試圖修改與play starter example給出的AsynchController。然而,當導航到http://localhost/message時,該功能似乎更多地用作睡眠而不是被設置和「忘記」的預定任務,即,可以繼續進行進一步編碼。

AsynchController片段:用自己的修改

public CompletionStage<Result> message() { 
     return getFutureMessage(5, TimeUnit.SECONDS).thenApplyAsync(s -> ok(views.html.User.Account.verified.render()), exec); 
    } 

    private CompletionStage<String> getFutureMessage(long time, TimeUnit timeUnit) { 
     CompletableFuture<String> future = new CompletableFuture<>(); 
     actorSystem.scheduler().scheduleOnce(
      Duration.create(time, timeUnit), 
      () -> future.complete("Waiting 5 seconds..."), 
      exec 
     ); 
     return future; 
    } 

路由條目

GET  /message     controllers.AsyncController.message 

目的:

我來這裏的目的是爲消息Waiting 5 seconds...來顯示,然後延遲+/- 5秒。此後,它將達到「未來」(這是否正確?),從而它會呈現一個視圖(或重定向到一個控制器),在這種情況下,verified頁面(用於驗證帳戶)。

我在正確的軌道上與我的原始目標,我在哪裏可以得到一個類似的東西很好的例子?

+0

你使用任何客戶端邏輯來處理服務器的響應? – tgk

+0

除非在客戶端使用具有特定呈現邏輯的分塊響應,否則我懷疑是否有以這種方式返回多個響應的任何解決方案 – cchantep

+0

@cchantep您能否根據Play Framework定義「客戶端」的含義?什麼是客戶端和什麼是「服務器端」(我假設服務器端功能正在執行控制器的代碼,路由到控制器) – KGCybeX

回答

1

我有一個簡單的解決方案,但你必須在路線中設置2個條目。

第一項顯示消息「Waiting 5 seconds ...」,同時它給第二個AJAX調用。第二個條目的控制器進行5秒的計算/休眠,並返回所需的內容,這些內容將通過Javascript呈現在第一頁上。

在你會把類似的第一個網頁:

axios.get(second-url) 
     .then(function (response) { 
     document.getElementById(someplaceholder).innerHTML=response.data. 
     }) 
+0

這可以擴展使用例如編輯你的個人資料,其中存在各種子菜單,點擊時,「佔位符」ia被子菜單的選項取代,如github的編輯個人資料頁面所示? – KGCybeX

+0

當然。然後你會讓每個子菜單給AJAX調用。但在Github的情況下,看着url欄,每個子菜單似乎指向不同的URL,所以這只是一個正常的http請求,而不是AJAX。 – haijin