小编Moh*_*ziz的帖子

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
查看次数

Jest 将对象与任意属性值进行比较

我正在用 Jest 测试 rest API。我知道我们toEqual过去常常通过递归比较所有属性来检查两个对象是否相等。

为原始值toEqual使用Object.is用于比较。

问题

我遇到的问题是在测试/register端点时。用户成功注册后,端点返回用户详细信息。使用详细信息包含电话、姓名、电子邮件等信息,在这种情况下更重要的是user_id

现在,我正在尝试的是这样的:

const data = {
  sponsor_id: 'ROOT_SPONSOR_ID',
  phone: '9999999999',
  name: 'Joe',
  password: 'shhhhh'
};

// Some API call goes here which returns `body`

expect(body).toEqual({
  user_id, // <-- How to test value of this?
  sponsor_id: data.sponsor_id,
  phone: data.phone,
  name: data.name
});
Run Code Online (Sandbox Code Playgroud)

我事先不知道user_id字段的返回值是什么。我只知道这将是一个数字。现在它可以是任何数值,那么在这种情况下如何测试具有任何值或任何数值的对象属性?

我还想检查一件事,我是否发送了超出预期的任何额外数据(属性)。顺便说一下toEqual,这已经在处理了。

如果我测试这种方法的方法有缺陷,那么请为我提供一个更好的解释。

javascript integration-testing unit-testing jestjs

5
推荐指数
1
解决办法
3617
查看次数

您的redux应用程序中的哪个套接字对象?

我正在使用react,redux和socket.io开发一个聊天应用程序。众所周知,redux对将某些状态传递给深层和嵌套的组件非常有帮助。我喜欢这个想法,将一些道具存储为redux状态,并将其传递给一些高度嵌套的组件。我正在使用socket.io-client库创建套接字对象。

我需要将创建的套接字对象传递给一些高度嵌套的组件,因此,我正在考虑在redux状态下创建套接字对象,以便可以在嵌套的组件上轻松使用它。

这是一个好方法还是应该做其他事情?

javascript sockets socket.io reactjs redux

3
推荐指数
1
解决办法
875
查看次数