Asynchronous Support

如果你对异步渲染感兴趣才需要看这节,并没有性能上的优势,只是支持异步的过滤器和扩展,如果你不关注异步,那么应该使用同步 api,如 var res = env.render('foo.html');。你不必每次都写 callback,这就是为什么在所有的渲染函数中是一个可选项。

nunjucks 1.0 会提供一种异步渲染模板的方式,这意味着自定义的过滤器和扩展可以做些类似从数据库获取内容的操作,模板渲染会等待直到调用回调。

模板加载器也可以异步,可使你从数据库或其他地方加载模板。查看 Writing a Loader。如果你在使用一个异步的模板加载,你需要使用异步的 api。内置的加载器是同步的,但并没有性能问题,因为文件系统是可以缓存的,而浏览器端会将模板编译成 js。

如果你使用了异步的,那么你需要使用异步的 api:

  1. nunjucks.render('foo.html', function(err, res) {
  2. // check err and handle result
  3. });

了解更多异步相关的查看 filters, extensionsloaders.

Be Careful!

Nunjucks 默认是同步的,因此你需要按照如下规则写异步模板:

  • 总是使用异步 api,调用 render 方法时应该有回调。
  • 在编译时需要提供异步过滤器和扩展,所以在预编译时(查看Precompiling)需要指定。
  • 如果你使用一个自定义的异步加载器,你不能在 for 中使用 include 模板,因为在 for 循环中会立即执行。而你需要使用 asyncEach 来循环,这和 for 的功能时相同的,但只用于异步场景。