I have been trying to use async-lock npm module to lock a /get resource execution.
import cors from "cors";
import express from "express";
import AsyncLock from "async-lock";
import _ from "lodash";
const app = express();
const port = process.env.port || 3001;
app.use(cors());
app.use(express.json());
let synchonizationKey: string = "";
let lock = new AsyncLock();
app.get("/pckg", (req, res) => {
let id = _.uniqueId();
console.log("--------------Request ", id, " arrived");
lock.acquire(
synchonizationKey,
function () {
console.log("--------------Request ", id, " lockAquired");
setTimeout(function () {
console.log("--------------Request ", id, " Done");
}, 3000);
},
function (err, ret) {
console.log("--------------Request ", id, " lockReleased");
res.send({ id: id });
},
{}
);
});
app.listen(port, () => console.log("Running on port#" + port));
Output: 4 get requests I fired from browser.
--------------Request 1 arrived
--------------Request 1 lockAquired
--------------Request 1 lockReleased
--------------Request 2 arrived
--------------Request 2 lockAquired
--------------Request 2 lockReleased
--------------Request 3 arrived
--------------Request 3 lockAquired
--------------Request 3 lockReleased
--------------Request 4 arrived
--------------Request 4 lockAquired
--------------Request 4 lockReleased
--------------Request 1 Done
--------------Request 2 Done
--------------Request 3 Done
--------------Request 4 Done
I was expecting a result on similar lines as it is answered in this question
It looks like lock is released as soon as all synchronous parts in the callback is executed.
Can someone please help me with this?
done,nextetc... you need to call it manually in yoursetTimeoutcode block, if there is any error, generally you need to pass it in that function like:next(error), In this context, What type of problem doesasync-locksolve ? You are making It complex, You don't need any callback library now day... use standardasync/awaitinsteadasync/awaitbut there's no need for everyone reinventing the wheel. Yes nowadays probably a promise-based approach may be preferred -- this is also supported by library. But there is still nothing wrong with using a callback-based approach ...