Javascript nodejs/express/ejs render()同步
对于简单的情况,上述方法也适用 如何使EJS将处理后的字符串作为函数的返回值返回? 让它像这样工作:Javascript nodejs/express/ejs render()同步,javascript,node.js,express,ejs,Javascript,Node.js,Express,Ejs,对于简单的情况,上述方法也适用 如何使EJS将处理后的字符串作为函数的返回值返回? 让它像这样工作: res.render("index.ejs", {}); 换句话说-我想嵌套/链接一些render()调用,而不是异步的 Express似乎在本机上不支持此功能,是吗? 如果不是,那么我将如何通过EJS直接实现它 如果您想知道我为什么喜欢“坏”方式(同步),那么我有一句话要说:缓存。 模板仍在缓存中,因此我不介意第一次加载模板的速度变慢(无论如何只需几毫秒)。 与必须处理对render()的嵌
res.render("index.ejs", {});
换句话说-我想嵌套/链接一些render()调用,而不是异步的
Express似乎在本机上不支持此功能,是吗?如果不是,那么我将如何通过EJS直接实现它 如果您想知道我为什么喜欢“坏”方式(同步),那么我有一句话要说:缓存。
模板仍在缓存中,因此我不介意第一次加载模板的速度变慢(无论如何只需几毫秒)。
与必须处理对render()的嵌套异步调用相比,单次延迟的时间分数成本是没有成本的。您只需将回调传递到
res.render
,该回调将使用呈现的字符串调用。这将通过async
完成,这是正确的方法,因为渲染可能需要读取文件
res.send(ejs.render("index.ejs", {}));
如果您不喜欢嵌套回调,我建议您查看一个异步库,如合适的名称async
。可以使用瀑布()函数执行以下操作:
app.get('/', function(req, res){
res.render('index', { title: 'Title' }, function(err, result) {
res.render('index2', {foo: 'data'}, function (err, result2) {
console.log('Render result:');
console.log(result2);
res.send(result2); // send rendered HTML back to client
});
});
});
我明确要求它是同步的。我知道其中的含义。请理解,在我的情况下,我要呈现()一个文件,它将呈现()另一个文件。因此,它嵌套在不同的文件中,而不是像您的解决方案那样发挥作用。谢谢。如果你真的想要同步,那么你需要编写你自己的渲染函数。
express
中的渲染函数需要使用回调。呵呵,我已经知道很多了!希望有人能想出解决办法。无论如何,我已经连接了我自己的函数。我个人认为,考虑到可以使用async
库的默认呈现来摆脱嵌套回调,这是愚蠢的。回调不仅仅是异步的,它们还提供了一种机制,可以在错误发生时进行回调和解救。如果确实渲染(ejs(ejs(ejs(…))),如果第二个渲染有问题,会发生什么?使用瀑布式方法
我可以在一个中心位置处理所有错误,并将适当的错误返回给客户。你有道理,但不要用这些情况“限制”自己。相信我,我知道我为什么想要它。我也告诉过它。如果你仔细阅读字里行间的话,你就会明白我的意思。
async.waterfall([
function(done) {
res.render('index', {title: 'Title'}, done);
},
function(result, done) { // result is the result of the first render
res.render( result, {foo: 'data'}, done);
}
], function (err, result) { // result is the result of the second render
console.log(result);
res.send(result);
});