私はこのようになり、ユーザーオブジェクトを持っている:どのように非同期プログラミングは、オブジェクトのプロパティに影響を与えない
{
name: "john",
cart: [1, 2, 3]
}
このオブジェクトは、私のexpress.jsウェブアプリに掲載されています。特定のルートでは、多くのミドルウェアがそのオブジェクトに作用し、ユーザーにも返されます。
問題は、ユーザー上で動作するミドルウェアの一部が非同期で、ユーザーオブジェクトを変更することです。また、私はできるだけ早く応答でユーザーオブジェクトを送り返そうとします。
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
の完全な、無修正カートのプロパティを必要とする、と呼ばれています。しかし、サーバーからの応答をできるだけ早く返信しようと努力しています(そして最後にuser.cart
が空の配列になるため)私はuser.cart
を空の配列に設定して直ちにそれを送り返します。
JSがオブジェクトのコピーを作成した場合、私は心配する必要はありませんが、user.cart
の値がasyncSaveCartInDataBase
の場合はどういう値なのか分かりません。
JSとノードの非同期性を利用してuser.cart
プロパティを変更し、すぐに非同期関数で使用するためのプロパティを変更しないでそれを送り返す方法はありますか?私は深いクローンや何かを作らなければなりませんか?
オブジェクトをコピーする必要があります。 – SLaks
単に 'user'のコピーを作成して空の配列で送信するのはなぜですか? – Mike
最適化は、 'user.cart'のバックアップを作成し、応答を登録し、カートをユーザに復元することです。 – Amadan