javascript - 等待 css_parser.getCSSFiles()

标签 javascript node.js express

我想在加载 CSS 时渲染页面。函数 css_parser.getCSSFiles() 异步读取文件并将 CSS 内容发送到变量 css.cssFile 。如何强制 res.render 等待文件读取结束?

router.get('/main', function(req, res) {

    var directory = '../app/public/stylesheets/',
        file = 'style_720.css';

    css_parser.getCSSFiles(directory,file);
    app.locals.css = css.cssFile;

    res.render('ua', {
        css: app.locals.css,
    });

});

//js module

getCSSFiles: function(directory, fileName) {
    var array = css.cssFile;
       fs.readFile(directory + fileName, 'utf8', function(err, data) {
           if (err) {
               return console.log(err);
           }
           (array.push(data));
       });
}

最佳答案

您必须更改 getCSSFiles() 以接受回调作为参数,然后让它在完成后调用该回调,然后您可以调用 res.render() 来自该回调内部。这是在 Node.js 中了解异步操作何时完成的常用方法。

没有其他方法可以知道它何时完成。它必须通过回调或某种事件通知(其中之一)来告诉您。

如果您向我们展示 getCSSFiles() 的代码,我们可能可以为您提供更具体的帮助。

你想要的最终结果(修改getCSSFiles()之后)是这样的:

router.get('/main', function(req, res) {

    var directory = '../app/public/stylesheets/',
        file = 'style_720.css';

    css_parser.getCSSFiles(directory,file, function(err, data) {
        if (!err) {
             res.render('ua', {css: data});
        }
    });
});

并且,将 getCSSFiles 更改为:

getCSSFiles: function(directory, fileName, callback) {
       fs.readFile(directory + fileName, 'utf8', function(err, data) {
           if (err) {
               callback(err);
               return console.log(err);
           }
           callback(null, data);
       });
}

关于javascript - 等待 css_parser.getCSSFiles(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31997911/

相关文章:

javascript - 提交后清除表单中的文本字段

Node.js - 扩展 res.render 的 Expressjs 中间件

javascript - express-session 不保存任何值

mysql - 正确的身份验证 NodeJS Express MySQL

javascript - 如何克服 Selenium CSS parent only CSS 选择器限制

javascript - 在 React 组件外声明一个 const 以在不同的地方使用它

javascript - 谷歌条形图不改变背景颜色

javascript - 如何使用 Node js 开发实时聊天

node.js - 编译 Node 给出 “No-old-style-declaration”标志错误

javascript - 可以通过浏览器和 websockets 连接到 azure 事件中心吗?