Node.js SWIG是否支持异步功能?
我有动态html页面使用Node.js和SWIG模板引擎。我需要从SWIG模板调用函数来从数据库获取用户数据以呈现页面内容。 SWIG调用函数但不等待数据库的响应。那么,是否可以调用异步函数并将数据返回到swig模板?
我的SWIG模板:todos.html
<body>
{%set todos=getTodos()%}
{%for item in todos%}
<div>{{item.name}}</div>
<div>{{itempleted}}</div>
{%endfor%}
</body>
我的节点服务器(使用快递):
.......
swig.setDefaults({locals:{getTodos:function(input){
setTimeout(function(){
return [
{name:"First todo",completed:false},
{name:"Same name",completed:true},
]
},5000)
})
........
但是,页面在不等待“超时”的数据的情况下呈现。
回答如下:所以基本上没有,你不能直接在模板中使用异步函数。它不受支持。
但是,您仍然可以通过首先异步获取所需的所有数据然后渲染swig模板来完成所需的操作。
这是最小的例子:
const swig = require('swig');
const express = require('express');
const app = express();
const swigEngine = new swig.Swig();
app.engine('html', swigEngine.renderFile);
app.set('view engine', 'html');
const loadTodos = function (callback) {
setTimeout(function () {
const todos = [
{name: "First todo", completed: false},
{name: "Same name", completed: true},
];
callback(null, todos);
}, 1000)
};
app.get('/', (req, res) => {
// So first you get the data asynchronously
loadTodos(function (err, data) {
if (err) {
res.sendStatus(400);
return;
}
res.render('index', {todos: data});
})
});
app.listen(5555, () => console.log('Server is running on port 5555.'))