首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NodeJs中的后缀器中执行查询异步

如何在NodeJs中的后缀器中执行查询异步
EN

Stack Overflow用户
提问于 2018-05-03 11:20:09
回答 2查看 147关注 0票数 1

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

代码语言:javascript
复制
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数据时,当我将该数据的值签入表时,如果表具有相同的值,则获取其id和insert,如果不是添加新记录,则获取其id和插入到另一个表中。

但是,首先select查询一直执行,而不是insert查询循环执行。

如何解决这个问题

查询是这样执行的

执行(默认):

id中选择pxl_tag作为pxl_tag,其中pxl_tag.name = 'a1'; 选择idpxl_tag中选择为pxl_tag,其中pxl_tag.name = 'a2'; 从id中选择pxl_tag AS pxl_tag,其中pxl_tag.name = 'a3'; 插入pxl_tag (idnamecreated_atupdated_at)值(默认值为'a3‘、'2018-05- 04 :35:32’、'2018-05- 04 :35:32‘、'2018-05- 04 :35:32');插入pxl_tag (idnamecreated_atupdated_at)值(默认值为'a3’、'2018-05-04 :35:32‘、’2018-05-04:35:32‘、’2018-05- 04:35:32');在pxl_tag (idnamecreated_atupdated_at)中插入值(默认值为“A3”、“2018-05-04:35:32”、“2018-05-04:35:32”);

但我希望第一步是selectinsert

EN

回答 2

Stack Overflow用户

发布于 2018-05-03 19:00:20

您可以从每一个库中使用异步方法。例如:

更新

代码语言:javascript
复制
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');
  }
});
票数 0
EN

Stack Overflow用户

发布于 2018-05-04 21:22:39

如果我正确地理解了您,问题并不是您的插入没有在选择之后立即运行。您的问题是在同步函数循环(getTag() and saveData())中调用异步函数(forEach()),因此,当异步函数解析时,它们将得到在同步循环中定义的tagData的最后一个值。您应该给它一个不同的范围来获得正确的tagData值。

试试这个(未经测试):

代码语言:javascript
复制
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 (而不是异步),则应该查看承诺和异步库。这可能会有帮助:解决承诺一个接一个(即顺序)?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50153812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档