2016-06-12 50 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的替代方案。感谢您的帮助!! –

相关问题