Как обойти асинхронности при записи в базу дублирующих данных?

221
13 июля 2017, 02:39

Нужно записать в базу такой запрос:

parseCarList =
[ { car_name: 'WV', parent_Id: null },
  { car_name: 'Skoda', parent_Id: 'WV' },
  { car_name: 'Opel', parent_Id: 'Skoda' },
  { car_name: 'Ford', parent_Id: 'Skoda' },
  { car_name: 'Peugeot', parent_Id: 'Skoda' },
  { car_name: 'GM', parent_Id: 'WV' },
  { car_name: 'Opel', parent_Id: 'GM' }, //Ошибка
  { car_name: 'Ford', parent_Id: 'GM' }, //Ошибка
  { car_name: 'Porche', parent_Id: 'GM' },
  { car_name: 'Peugeot', parent_Id: 'GM' }, //Ошибка
  { car_name: 'Tesla', parent_Id: 'Peugeot' } ]

Не будем в даваться в иерархию брендов и их реальной причастности друг к другу.

Задача по циклу писать в базу производителя и его родителя если таковой имеется.

parseCarList.forEach(item => {
    if (item.car_name) { //если есть орг нейм
    db.cars.findAll({where: {name: item.car_name}})
        .then(function (validCar) {
            if (validCar.length > 0) { // если нашли
                item.carid = validCar[0].dataValues.id;
                //тут еще будет записываться в базу родитель
            }
            if (validCar.length < 1) { // если не нашли
                createNewCar(item)
                    .then(function (createdCar) {
                        item.carid = createdCar.dataValues.id;
                        //тут еще будет записываться в базу родитель
                    })
                    .catch(error => console.log(error));
           }
       })
       .catch(error => console.log('Validation: ' + item.car_name + ' found Error: ' + error));
    }
});

Все пишет прекрасно (все машины в базу пишутся) кроме тех дублирующих позиций, что я пометил "Ошибка", а ошибку я получаю т.к. запросы идут асинхронно и к тому моменту как проходит цикл, база не успевает создать ранее созданного производителя и дублирующая надпись не находя его в базе пытается сделать его заного, но видимо к тому моменту как уже начнет делать в базе такая запись уже будет, поле car_name unique: true и я получаю ошибку:

New Car Opel not created, Error: SequelizeUniqueConstraintError: Validation error

Красивый вид ошибок я еще допилю, не обращаем внимания.

Выход писать синхронно и ждать каждую созданную машину? А если на какой то машине база застрянет?

READ ALSO
Тяжелая JavaScript анимация (parallax)

Тяжелая JavaScript анимация (parallax)

Учу JSПопробовал написать свой Parallax плагин

185
Как отслеживать, а затем скрывать или показывать при определенных условиях элементы

Как отслеживать, а затем скрывать или показывать при определенных условиях элементы

Имеется страница, на которой находится n-ое кол-во tabs(вкладок), на каждой вкладке есть автоматически создаваемый элемент в виде кнопки "Удалить"...

204
Многоуровнёвое меню в массиве

Многоуровнёвое меню в массиве

Нужно сделать трёхуровнёвое меню для интернет-магазина, которое будет открываться по клику

275