2017-06-23 69 views
0

我對nodejs,express和javascript相當陌生。 我有一個代碼:在參數評估之前調用表達式渲染

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

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

的FileReader使用fs.readFileSync所以它首先讀取所有文件,然後返回一個大的字符串讀取文件中的for循環。

然後將該字符串傳遞給查看和呈現。

上面的代碼工作正常,但是當我改成這樣:

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和fileReader並行調用?

請解釋。

+1

您可以發佈了代號爲的FileReader()? – roughcoder

+0

兩個例子都是相同的。你確定第一個產生了真正的結果嗎? –

+0

@roughcoder添加了文件讀取器 – Jan

回答

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) 
    }); 

} 

您的FileReader及以下的路線:

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

如果fs.readFile是異步的,那麼在內容填充之前不會調用解析?或者解決之前的代碼是先執行完成的?或者承諾對內容的返回引用,因爲你這樣做了。然後用空內容調用該解析,但是隨着文件被讀取,內容被填充了嗎?這也保證文件的順序被添加到內容中嗎?或將(可能)它是隨機的?感謝您的回答,但請您能詳細說明一下 – Jan

+0

對不起,這個遲到的答案,我正在尋找一個更好的解決方案,只是發現這個:https://blog.risingstack.com/node-hero-async-programming-in -node-js/ 如果您繼續滾動到「承諾」一章,您可以找到解決問題的方法。這個過程很簡單,他用promise包裝fs.stat函數,然後用'Promise.all()'解決它們。你可以用'fs.readFile()'而不是'fs.stat()'來做同樣的事情' – mJehanno

+0

謝謝,我正在玩更多的東西,並且實際上也提出了這個問題,但我不拒絕承諾沒有文件,但總是解決,差異是價值。如果我理解正確的第一個拒絕,停止處理其餘的承諾,所以如果第一個文件不存在,我將永遠不會閱讀其餘的。所以我有一個承諾數組並等待所有這些數據,即使錯誤地使用NaN值進行解析,然後過濾結果數組,然後僅使用來自fs read的數據,然後將這些數據作爲新數組進行查看,這樣也可以訂單是有保證的。 – Jan