Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs/express/ejs render()同步_Javascript_Node.js_Express_Ejs - Fatal编程技术网

Javascript nodejs/express/ejs render()同步

Javascript nodejs/express/ejs render()同步,javascript,node.js,express,ejs,Javascript,Node.js,Express,Ejs,对于简单的情况,上述方法也适用 如何使EJS将处理后的字符串作为函数的返回值返回? 让它像这样工作: res.render("index.ejs", {}); 换句话说-我想嵌套/链接一些render()调用,而不是异步的 Express似乎在本机上不支持此功能,是吗? 如果不是,那么我将如何通过EJS直接实现它 如果您想知道我为什么喜欢“坏”方式(同步),那么我有一句话要说:缓存。 模板仍在缓存中,因此我不介意第一次加载模板的速度变慢(无论如何只需几毫秒)。 与必须处理对render()的嵌

对于简单的情况,上述方法也适用

如何使EJS将处理后的字符串作为函数的返回值返回? 让它像这样工作:

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);
});