Я пытался использовать модуль npm async-lock для блокировки выполнения ресурса /get.
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));
Вывод: 4 запроса на получение, которые я запускал из браузера.
--------------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
Я ожидал результата в тех же строках, что и в этом вопрос
Похоже, что блокировка снимается, как только выполняются все синхронные части обратного вызова.
Может кто-нибудь, пожалуйста, помогите мне с этим?
done
,next
и т. д. вам нужно вызвать ее вручную в блоке кодаsetTimeout
, если есть какая-либо ошибка, обычно вам нужно передать ее в эту функцию, например:next(error)
, в этом контексте, какой тип проблемы решаетasync-lock
? Вы делаете это сложным, вам не нужна библиотека обратного вызова сейчас... вместо этого используйте стандартныйasync/await
- person Nur   schedule 04.07.2021async/await
, но нет нужды изобретать велосипед. Да, в настоящее время, вероятно, может быть предпочтительнее подход на основе обещаний - он также поддерживается библиотекой. Но все же нет ничего плохого в использовании подхода, основанного на обратном вызове... - person derpirscher   schedule 04.07.2021