Node.js SWIG是否支持异步功能?

问题描述 投票:0回答:1

我有动态html页面使用Node.js和SWIG模板引擎。我需要从SWIG模板调用函数来从数据库获取用户数据以呈现页面内容。 SWIG调用函数但不等待数据库的响应。那么,是否可以调用异步函数并将数据返回到swig模板?

我的SWIG模板:todos.html

<body>
{%set todos=getTodos()%}
{%for item in todos%}
  <div>{{item.name}}</div>
  <div>{{item.completed}}</div>
{%endfor%}

</body>

我的节点服务器(使用快递):

.......
swig.setDefaults({locals:{getTodos:function(input){
       setTimeout(function(){
        return [
                {name:"First todo",completed:false},
                {name:"Same name",completed:true},
               ]
       },5000)
    })
........

但是,页面在不等待“超时”的数据的情况下呈现。

html node.js swig-template
1个回答
2
投票

所以基本上没有,你不能直接在模板中使用异步函数。它不受支持。

但是,您仍然可以通过首先异步获取所需的所有数据然后渲染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.'))

如果您这样做,您的模板也会变得更简单:

{%for item in todos%}
	<!-- You have missed the curly brackets here {{}} -->
	<div>{{item.name}}</div>
	<div>{{item.completed}}</div>
{%endfor%}
© www.soinside.com 2019 - 2024. All rights reserved.