你好,我试过下面的代码,但是我的代码不能正常工作。
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'; 选择id从pxl_tag中选择为pxl_tag,其中pxl_tag.name= 'a2'; 从id中选择pxl_tagASpxl_tag,其中pxl_tag.name= 'a3'; 插入pxl_tag(id、name、created_at、updated_at)值(默认值为'a3‘、'2018-05- 04 :35:32’、'2018-05- 04 :35:32‘、'2018-05- 04 :35:32');插入pxl_tag(id、name、created_at、updated_at)值(默认值为'a3’、'2018-05-04 :35:32‘、’2018-05-04:35:32‘、’2018-05- 04:35:32');在pxl_tag(id、name、created_at、updated_at)中插入值(默认值为“A3”、“2018-05-04:35:32”、“2018-05-04:35:32”);
但我希望第一步是select和insert
发布于 2018-05-03 19:00:20
您可以从每一个库中使用异步方法。例如:
更新
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');
}
});发布于 2018-05-04 21:22:39
如果我正确地理解了您,问题并不是您的插入没有在选择之后立即运行。您的问题是在同步函数循环(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 (而不是异步),则应该查看承诺和异步库。这可能会有帮助:解决承诺一个接一个(即顺序)?
https://stackoverflow.com/questions/50153812
复制相似问题