Как выполнить асинхронный запрос в сиквелизере в NodeJs - PullRequest
0 голосов
/ 03 мая 2018

привет, я попробую ниже код, но мой код не работает должным образом

tags.forEach(function(value) {
    var where1 = {};
    var attr1 = ['id'];
    attr1 = ['id'];
    where1['name'] = value;
    tagData['name'] = value;
    tagModel.getTag(where1, attr1, function(code2,result2){
        if(result2.length!=0) {
            var quick_start_tagData={'quick_start_id' : result1['id'], 'tag_id' :result2[0]['id']}
            quick_start_tagModel.saveData(quick_start_tagData, function(code2,result2){
            });
            console.log(quick_start_tagData); 
         } else {
              tagModel.saveData(tagData, function(code2,result2) {});
           }
     });
});

проблема заключается в том, что цикл повторяет данные no.of, когда я проверяю значение этих данных в таблице, если таблица имеет то же значение, затем получает ее идентификатор и вставляет, а если нет, то добавляет новую запись и получает ее идентификатор и вставляет в другую таблицу

но первый select запрос выполняется все время, а затем insert запрос выполняется в цикле

как решить эту проблему

Запрос Выполнить так

Выполнение (по умолчанию):

ВЫБРАТЬ id ОТ pxl_tag КАК pxl_tag ГДЕ pxl_tag. name = 'a1';

ВЫБРАТЬ id ОТ pxl_tag КАК pxl_tag ГДЕ pxl_tag. name = 'a2';

ВЫБРАТЬ id ОТ pxl_tag КАК pxl_tag ГДЕ pxl_tag. name = 'a3';

INSERT INTO pxl_tag (id, name, created_at, updated_at) ЗНАЧЕНИЯ (DEFAULT, 'a3', '2018-05-04 04:35:32', '2018-05-04 04:35:32');

INSERT INTO pxl_tag (id, name, created_at, updated_at) ЗНАЧЕНИЯ (DEFAULT, 'a3', '2018-05-04 04:35:32', '2018-05-04 04:35:32');

INSERT INTO pxl_tag (id, name, created_at, updated_at) ЗНАЧЕНИЯ (ПО УМОЛЧАНИЮ, «a3», «2018-05-04 04:35:32», «2018-05-04 04:35:32»);

но я хочу сначала select и insert шаг за шагом

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Если я правильно вас понял, проблема не в том, что ваши INSERT не запускаются сразу после SELECT. Ваша проблема в том, что вы вызываете асинхронные функции (getTag() and saveData()) внутри цикла функции синхронизации (forEach()), таким образом, к моменту разрешения ваших асинхронных функций они получают последнее значение для tagData, которое определено внутри цикл синхронизации. Вы должны задать ему другую область видимости, чтобы получить правильное значение tagData.

Попробуйте это (не проверено):

tags.forEach(function(value) {
    var where1 = {};
    var attr1 = ['id'];
    attr1 = ['id'];
    where1['name'] = value;
    tagData['name'] = value;
    saveTag(tagModel, quick_start_tagModel, where1, attr1, result1, tagData);
});

//Create a function so that tagData will have a different scope for each call
function saveTag(tagModel, quickStartTagModel, where, attr, result1, tagData) {
    tagModel.getTag(where, attr, function(code,result){
        if(result.length!=0) {
            var quickStartTagData = {'quick_start_id' : result1['id'], 'tag_id' :result[0]['id']}
            quickStartTagModel.saveData(quickStartTagData, function(code, result){});
            console.log(quickStartTagData); 
        } else {
            tagModel.saveData(tagData, function(code,result) {});
        }
    });
}

если вам строго необходимо последовательно запускать SELECT и INSERT (а не асинхронно), вам следует посмотреть на Promises и асинхронную библиотеку. Это может помочь: Разрешать обещания одно за другим (т.е. по порядку)?

0 голосов
/ 03 мая 2018

Вы можете использовать каждый метод из async библиотеки. Например:

UPDATE

async.each(tags, function(value, cb) {
  var where1 = {};
  var attr1 = ['id'];
  attr1 = ['id'];
  where1['name'] = value;
  tagData['name'] = value;
  tagModel.getTag(where1, attr1, function(code2, result2) {
    if (result2.length != 0) {
      var quick_start_tagData = {
        'quick_start_id': result1['id'],
        'tag_id': result2[0]['id']
      }
      quick_start_tagModel.saveData(quick_start_tagData, function(code2, result2) {
        cb();
      });
      console.log(quick_start_tagData);
    } else {
      tagModel.saveData(tagData, function(code2, result2) {
        cb();
      });
    }
  });
}, function(err) {
  if (err) {
    console.log('An error ocurred');
  } else {
    console.log('Nothing happens');
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...