我正在尝试使用节点js阅读电子表格并将数据保存在数据库中,但我遇到了代码同步的问题。问题是,getDataProduct方法在insertProduct启动之前运行了2230次。当我查看dabatase时,只需保存最后一行的数据。有人可以帮帮我吗?
try {
excel_products.forEach(function (v, i) {
x = 1;
var run = true;
while (run) {
if (v.data[x] !== undefined) {
if (v.data[x][15] != '') {
getDataProduct(v, x);
insertProduct();
insertProductSku();
insertProductStore();
}
} else {
run = false;
}
x++;
}
});
} catch (error) {
console.log(error);
}
更新
我认为问题是这个函数,在insertProduct()中:
sql_product = 'INSERT QUERY';
connection.then(function () {
new db.Request().query(sql_product).then(function (recordset) {
}).catch(function (error) {
console.log(error);
});
}).catch(function (error) {
console.log(error);
});
当我打印sql_product时,它确定,但我认为保存在数据库中的功能太慢而无法运行。
答案 0 :(得分:0)
您可能需要考虑使用asyncjs:https://github.com/caolan/async
每个系列会一次调用一个insertProduct,只要你可以装备insertProduct()在完成它的任务时调用一个回调。
如果你想一次运行多个插入,那么像队列这样的函数可以一次生成x个插入任务。
答案 1 :(得分:0)
一些可能有帮助的事情:
1 /函数insertProduct和其他函数使用全局变量很奇怪......我建议你使用params。
2 /来自db.Request().query
的承诺应该在外面返回,也许承诺内的回报应该是真的,而不是来自数据库的回复(不要在不需要的函数之外共享信息)
function insertProduct(product){
sql_product = 'INSERT QUERY';
....
return db.Request().query(sql_product).then(function (recordset) {
return true;
}).catch(function (error) {
console.log(error);
})
}
如果您的所有功能都执行此操作,您可以执行以下操作:
//We can jump de catch you have it inside the functions
insertProduct(product).then(function(){
insertProductSku(product).then(function(){
insertProductStore(product)
})
})
\ 3看起来你需要按特定顺序进行迭代,你需要创建一个像这样添加实际逻辑的函数:
function nextIteration(pos) {
var product = excel_products[pos];
if (product.data[x] !== undefined) {
if (product.data[x][15] != '') {
var product = getDataProduct(v, x);
insertProduct(product).then(function() {
insertProductSku(product).then(function() {
insertProductStore(product).then(function() {
nextIteration(pos + 1)
});
})
})
} else {
nextIteration(pos + 1)
}
}
}
nextIteration(0);
我知道这个实现很奇怪,但是当你已经有了这个信息时,你将解决下一个动作。如果您不关心订单或使用promise.all()
简化结构,您可以查看.bind
,但最好一步一步地进行。
我没有尝试过多触及逻辑。我希望我很清楚。