如何在NodeJs中的sequelizer中执行查询异步

时间:2018-05-03 11:20:09

标签: node.js express sequelize.js

你好我试过下面的代码,但我的代码不能正常工作

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) {});
           }
     });
});

问题是循环迭代数据当我将数据的值检查到表中,如果表具有相同的值然后获取其id并插入,如果不是添加新记录并获取其id并插入另一个表

但首先select查询执行所有时间而不是insert查询在循环中执行

如何解决这个问题

查询执行方式

执行(默认):

  

SELECT id FROM pxl_tag AS pxl_tag WHERE pxl_tagname =' a1';

     

SELECT id FROM pxl_tag AS pxl_tag WHERE pxl_tagname =' a2';

     

SELECT id FROM pxl_tag AS pxl_tag WHERE pxl_tagname =' a3';

     

INSERT INTO pxl_tagidnamecreated_atupdated_at)价值观   (默认,' a3',#201; 201-04-04 04:35:32',' 2018-05-04 04:35:32');

     

INSERT INTO pxl_tagidnamecreated_atupdated_at)价值观   (默认,' a3',#201; 201-04-04 04:35:32',' 2018-05-04 04:35:32');

     

INSERT INTO pxl_tagidnamecreated_atupdated_at)价值观   (DEFAULT,&#39; a3&#39;,#201; 02-04 04:35:32&#39;,&#39; 2018-05-04 04:35:32&#39;); < / p>

但我希望首先selectinsert一步一步

2 个答案:

答案 0 :(得分:0)

您可以使用each库中的async方法。 例如:

<强>更新

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');
  }
});

答案 1 :(得分:0)

如果我理解正确,问题不在于您的INSERT在SELECT之后不会立即运行。您的问题是您在同步函数循环(getTag() and saveData())内调用异步函数(forEach()),因此,当您的异步函数解析时,它们将获得{{1}的最后一个值在同步循环中定义的。你应该给它一个不同的范围来获得正确的tagData值。

试试这个(未经测试):

tagData

如果你需要顺序运行SELECT和INSERT(而不是异步),你应该看看promises和async库。这可能有所帮助: Resolve promises one after another (i.e. in sequence)?