在参数评估之前调用表达式

时间:2017-06-23 08:02:25

标签: javascript node.js express asynchronous

我对nodejs,express和javascript很新。 我有一个代码:

router.get('/', function(req, res, next) {
    const content = fileReader();

    res.render('index', { "content" :  content } );
});

fileReader正在使用fs.readFileSync读取for循环中的文件,因此它首先读取所有文件,然后返回一个大字符串。

然后将此字符串传递给view并呈现。

上面的代码工作正常,但当我将其更改为:

router.get('/', function(req, res, next) {
    res.render('index', { "content" :  fileReader() } );
});

它不起作用。页面已呈现,但内容为空。

fileReader函数:

const fileReader = function()
{
    let low = 0;
    let high = 9;

    let content = "";

    for( ; low <= high; low++ )
    {
        if( fs.existsSync( contentDir + "/" + low ) )
        {
            content += fs.readFileSync( contentDir + "/" + low, "utf-8" );
        }
        else
        {
            break;
        }
    }

    return content;
}

有人能解释一下这里发生了什么吗?为什么在fileReader()完成之前调用render?不应该先执行函数并调用render等待结果?还是并行调用render和fileReader?

请解释。

1 个答案:

答案 0 :(得分:0)

在nodeJs中使用同步功能并不是一个好主意,我很确定这就是为什么它在没有内容的情况下呈现你的页面的原因。

你还应该做的是:

const fileReader = function()
{
   return new Promise((resolve,reject)=>{
     let low = 0;
     let high = 9;

     let content = "";

     for( ; low <= high; low++ )
     {
       fs.readFile( contentDir + "/" + low, "utf-8",(err,data)=>{
           if(err){
               reject(err);
           }
           content += data;
       });
     }
     resolve(content)
   });

}

您的文件阅读器以及您的路线的以下内容:

router.get('/', function(req, res, next) {
    fileReader().then((data)=>{
        res.render('index', { "content" :  data } );
     }).catch((error)=>{
          //handle your error
     }); 
 });