2016-06-12 77 views
0

我有一個簡單的應用程序,它向客戶端請求傳入數據,進行計算並提供答案。計算由服務器執行幾秒鐘,因此,所有這些客戶端都會看到數據輸入表單並嘗試多次推送「發送」按鈕。顯然,服務器處理所有這些請求。解決這個問題的更好方法是使用一些「等待」頁面。但是我找不到如何先渲染「等待」頁面並在計算之後渲染最終頁面的方式。如何爲1個請求呈現2個頁面(快速js)

不幸的是我不能在客戶端使用javascripts。

app.post('/answer', function (req, res, next) 
{  
    res.render('pleaseWait.jade'); 
    someLongFunction(); 
    next(req, res); 
}, function(req, res) 
{ 
    res.render('targetPage.jade'); 
}); 

這樣的代碼不能正常工作。

任何想法如何組織一個接一個地呈現兩個頁面?

+0

這不是微不足道的,它可能更容易阻止從瀏覽器發送多個請求(通過禁用_Send_按鈕或跟蹤是否已經有一個計算被激活)。 – robertklep

+0

感謝您的快速回答。我不能在客戶端使用js,因此無法在瀏覽器中更改DOM。無論如何,客戶端不知道推送SEND按鈕後會發生什麼。向客戶通知他的請求已被接受並處理 –

+0

@AndreyErmolovich爲什麼不直接向服務器查詢計算結果並在完成時執行客戶端重定向?在那裏沒有DOM操作...... – eenagy

回答

0

快速和骯髒的解決辦法是使一個模板,等待計算到結束,然後渲染所述第二模板,並通過相同的響應推:

app.post('/answer', (req, res) => { 
    res.render('pleaseWait.jade', (err, html) => { 
    res.write(html + '\n'); 
    setTimeout(() => { // mimick a calculation that takes some time 
     res.render('targetPage.jade', { result : 42 }, (err, html) => { 
     res.end(html + '\n'); 
     }); 
    }, 2000); 
    }); 
}); 

第二模板將包含一點CSS代碼隱藏「請等待」消息:

// pleaseWait.jade 
html 
    head 
    body 
    h1.please-wait Please wait for your calculation... 

// targetPage.jade 
html 
    head 
    style. 
     .please-wait { display: none } 
    body 
    h1 Done 
    p The result of your calculation is #{ result } 

不過,我再次重申,這是快速和骯髒的,因爲每個模板將呈現爲一個完整的HTML頁面(與周圍的<html>...</html>),你基本上是sendi瀏覽器使用兩個完整頁面進行單一響應。

或者,而不是直接渲染targetPage.jade,你可以寫一點的JS代碼重定向到最終的結果頁面:

setTimeout(() => { 
    res.end('<script>window.location.href="/result"</script>'); 
}); 

雖然你將需要傳播任何計算結果的一些方法。

+0

似乎在客戶端沒有JS的替代方案。感謝您的幫助!! –

相關問題