Как сгенерировать код при отправке 2 вещей одновременно в узле js - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть узел js, и я хочу сгенерировать код для кода_ действия, я хочу сгенерировать такой код: LA0000000001, LA0000000002, LA0000000003 и т. Д. Последовательно. Я пробовал вот так, но в некоторых случаях, когда я отправляю 2 действия одновременно, одно из действий будет потеряно и не будет отправлено, иногда также код, который вводится дважды и вызывает следующее действие, не может быть отправлено. Что не так с моим кодом? Спасибо за помощь:)

this.insertMasterActivity = function(req, res) {
    var id = uuidv1();
    var activity_kode = null;
    var activity_subject = req.body.activity_subject;
    var created = new Date();

    connection.acquire(function(err, con) {
        con.query('select activity_kode from activities order by created desc limit 1', function(err, result) {
            con.release();
            if (err) {
                res.send({ status: 400, message: 'Activities Failed' });
            } else {
                // for generate activity_kode
                if (result.length != 0) {
                    var test = result[0].activity_kode;
                } else {
                    var test = "LA00000000000"
                }

                var pieces = test.split('LA');
                var lastNum = pieces[1];
                lastNum = parseInt(lastNum, 10);
                lastNum++;
                activity_kode = "LA" + ("00000000000" + lastNum).substr(-10);
                console.log(activity_kode);
                connection.acquire(function(err, con) {
                    con.query('INSERT INTO activities (id, activity_kode,activity_subject,created) VALUES (?,?,?,?)', [id, activity_kode, activity_subject, created], function(err, result) {
                        con.release();
                        // console.log(err);
                        if (err) {
                            res.send({ status: 400, message: 'creation failed' });
                        } else {
                            res.send({ status: 200, message: 'created successfully' });
                        }
                    });
                });
            };
        });
    });
}

1 Ответ

0 голосов
/ 18 апреля 2019

Я думаю, это то, что я называю состоянием гонки. Я просто знаю два способа решить эту проблему.

  1. Измените activity_kode на более уникальный activity_kode. как UUID.
  2. Использовать семафор.

Изменить activity_kode на UUID проще, чем реализовать семафор. Концепция семафора похожа на дверь с замком. Если дверь заперта, не заходите, кто-то внутри. Поместите некоторую логическую переменную, которая работает как дверь, проверьте, заблокирована ли эта дверь, прежде чем генерировать activity_kode.

Многие способы его реализации, поскольку это вопрос node.js, обратный вызов или async-await могут использоваться способом, реализующим семафор. Кто-то использует поле флага в базе данных, кто-то использует только переменную, кто-то использует для нее пустой файл, кто-то использует простой текстовый файл, содержащий только 1 или 0. Многие способы.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...