node.js异步模版ariestp
发布于 8 年前 作者 DoubleSpout 4382 次浏览 来自 分享

开源一个node.js的异步模版,具体这个模版和其他模版有什么区别呢?

线上开源项目地址: https://github.com/DoubleSpout/ariestp

其实这个模版实现的功能很简单,可以把一些异步操作,放在模版里去执行,举个简单的例子如下:

  "use strict";
  const aries = require("ariestp");
  const fs = require("fs");
  const http = require("http");
  
  const asyncTpl = `<%?
	  ctx.thinking;
	  setTimeout(function () {
		ctx.thinking = "1 seconde later"
		aries();      
	  }, 1000);
  
	  %>
	  <%- ctx.thinking %>
  
	  <%?
	  ctx.http.get('http://www.baidu.com/', (res) => {
		  ctx.status =  res.statusCode;
		  res.resume();
		  aries();
	  }).on('error', (e) => {
		ctx.status = 500;
		aries();
	  });
	  %>
	  <%- ctx.status %>
	  `;

  aries.compile(asyncTpl, {http:http}, (err, renderStr, isUseCache) => {
		  if(err) return console.log(err);
		  console.log(renderStr);
  });

模板语言和 ejs 类似,不过多了一个 <%? … %> 这样的异步流程控制,在异步流程结束后,记得需要调用一下 aries(); 表示异步结束,继续执行模板解析。

上述代码执行结果如下: 1、模版将等待1秒钟后输出 “1 second later" 2、然后模版将请求 www.baidu.com 然后将百度的返回的status打印出来,不出意外就是打印"200”

至于为什么要做这样一个可以在模板里执行异步操作的模板引擎呢?也是公司项目的特殊需要,想要做到就是不发布代码,直接可以修改页面的展示,至于模板性能肯定是不如同步的 ejs 的,做过压测,大约是ejs性能的70%左右。

分享给大家,如果各位朋友类似的需求,可以使用这个库来帮助开发。

3 回复

我看正文的示例中,有两个异步调用,他们是一起发生的还是顺序的?

@alsotang 按顺序执行的,因为后面模板的同步渲染输出需要前面异步返回的结果,所以这边是同步,但是是非阻塞的

来自酷炫的 CNodeMD

这真是千奇百怪的需求啊

回到顶部