相关疑难解决方法(0)

fs.readFileSync似乎比fs.readFile更快 - 可以用于生产中的Web应用程序吗?

我知道在节点开发时,你应该总是试图避免阻塞(同步)函数并使用异步函数,但是我会稍微测试一下它们如何比较.

我需要打开一个包含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在我的情况下使用,还是以后会遇到麻烦?

io localization node.js

38
推荐指数
2
解决办法
3万
查看次数

async/await阻塞事件循环吗?

我正在阅读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.

javascript asynchronous node.js promise async-await

7
推荐指数
1
解决办法
4657
查看次数