Javascript 异步编程如何影响对象';性质
我有一个如下所示的用户对象:Javascript 异步编程如何影响对象';性质,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有一个如下所示的用户对象: { name: "john", cart: [1, 2, 3] } 此对象已发布到my express.js web app。在某些路由上,许多中间件作用于该对象,并将其发送回用户 问题在于,在用户上运行的一些中间件是异步的,并且修改了用户对象。我还尝试尽快将用户对象发送回响应中 考虑到Javascript使用通过共享调用,我不确定对象会发生什么,因为它的属性会被异步函数修改(可能在对象被发回之前)。这就是我要说的 // This would be c
{
name: "john",
cart: [1, 2, 3]
}
此对象已发布到my express.js web app。在某些路由上,许多中间件作用于该对象,并将其发送回用户
问题在于,在用户上运行的一些中间件是异步的,并且修改了用户对象。我还尝试尽快将用户对象发送回响应中
考虑到Javascript使用通过共享调用,我不确定对象会发生什么,因为它的属性会被异步函数修改(可能在对象被发回之前)。这就是我要说的
// This would be called after a post request
app.use(function (req, res, user) {
asyncSaveCartInDataBase(user, function (user) {
// Just an example
user.cart.push('things')
})
user.cart = []
res.json(user);
});
这里调用了asyncSaveCartInDataBase
,它需要用户的完整、未修改的购物车属性。但是,为了尽快从我的服务器发回响应(并且因为user.cart
最后总是一个空数组),我将user.cart
设置为一个空数组,并立即发回
如果JS复制了该对象,我就不必担心,但它没有,因此我不知道user.cart
在回调asyncSaveCartInDataBase
时的值是多少
有没有一种方法可以使用JS和node的异步特性来更改user.cart
属性,并立即将其发送回去,同时不修改该属性以便在异步函数中使用。我必须做一个深度克隆还是什么?你所做的听起来像是一场噩梦。在同一对象上有不同的中间件。有些正在变异,有些没有,有些已经失控
在我看来,你必须更明确地区分你的关注点。您使用的中间软件似乎有两种:
将请求转换为发送回用户的响应的中间件
需要原始请求(或其变体)的中间件
我的建议是:
确保有一个请求实例被中间件转换
任何需要自己的、未修改的请求变体的中间件都必须对其所需的全部或部分请求进行深度复制
JavaScript是异步和单线程的,但这并不意味着它不受竞争条件的影响。共享状态仍然会导致问题,应该尽可能地将其最小化。您正在做的事情听起来有点像噩梦。在同一对象上有不同的中间件。有些正在变异,有些没有,有些已经失控
在我看来,你必须更明确地区分你的关注点。您使用的中间软件似乎有两种:
将请求转换为发送回用户的响应的中间件
需要原始请求(或其变体)的中间件
我的建议是:
确保有一个请求实例被中间件转换
任何需要自己的、未修改的请求变体的中间件都必须对其所需的全部或部分请求进行深度复制
JavaScript是异步和单线程的,但这并不意味着它不受竞争条件的影响。共享状态仍然会导致问题,应该尽可能地最小化。您应该复制对象。为什么不创建一个user
的副本,并用空数组发送它呢?优化方法是备份user.cart
,注册响应,然后将购物车还原到用户。您应该复制对象。为什么不创建一个user
的副本,并用空数组发送该副本呢?优化方法是备份user.cart
,注册响应,然后将购物车还原到用户。