我知道在节点开发时,你应该总是试图避免阻塞(同步)函数并使用异步函数,但是我会稍微测试一下它们如何比较.
我需要打开一个包含i18n数据(如日期和时间格式等)的json文件,并将该数据传递给使用此数据格式化我的视图中的数字等的类.
在回调中开始包装所有类的方法会有点尴尬,所以如果可能的话,我会使用同步版本.
console.time('one');
console.time('two');
fs.readFile( this.dir + "/" + locale + ".json", function (err, data) {
if (err) cb( err );
console.timeEnd('one');
});
var data = fs.readFileSync( this.dir + "/" + locale + ".json" );
console.timeEnd('two');
Run Code Online (Sandbox Code Playgroud)
这导致我的控制台中的以下行:
two: 1ms
one: 159ms
Run Code Online (Sandbox Code Playgroud)
似乎fs.readFileSync比fs.readFile快约150倍,并且需要大约1ms才能加载50KB的json文件(缩小).我所有的json文件大约是50-100KB.
我也在考虑以某种方式将这个json数据记忆或保存到会话中,以便每个会话只读取一次文件(或者当用户更改其语言环境时).我不完全确定如何做到这一点,这只是一个想法.
可以fs.readFileSync在我的情况下使用,还是以后会遇到麻烦?
我正在阅读Node.js指南中的" 不要阻止事件循环 ".有一句话说:
您应该确保永远不会阻止事件循环.换句话说,每个JavaScript回调都应该快速完成.这当然也适用于你
await的,你Promise.then的,等等.
我开始想知道,如果一些API调用数据库我正在await花费一些时间来解决,这是否意味着我已经阻止了该await调用的事件循环?
之后,我开始测试一些自编代码,但经过测试后,我仍然不清楚阻塞是如何await工作的.以下是一些测试代码:
假设我正在使用express进行测试.我理解为什么/test在这种情况下对路由进行2次API调用会阻塞事件循环.
function someHeavyWork() {
// like calling pbkdf2 function
}
app.get('/test', (req, res) => {
someHeavyWork();
res.json(data);
});
Run Code Online (Sandbox Code Playgroud)
但在这种情况下不会发生这种情况.
function fakeDBCall() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(data);
}, 5000)
})
}
app.get('/test', async (req, res) => {
const data = await fakeDbCall();
res.json(data);
})
Run Code Online (Sandbox Code Playgroud)
这可能是因为我缺乏对阻塞如何工作的理解async/await.