我对包含查询的for循环(knexjs.org)有些困难。让我们开始如何遍历数组。我的数组如下:
[ { module_id: 9, able: '1', will: '1' },
{ module_id: 9, able: '1', will: '1' },
{ module_id: 2, able: '1', will: '1' },
{ module_id: 2, able: '1', will: '1' },
{ module_id: 4, able: '1', will: '1' },
{ module_id: 4, able: '1', will: '1' },
{ module_id: 1, able: '1', will: '1' },
{ module_id: 1, able: '1', will: '1' },
{ module_id: 8, able: '1', will: '1' },
{ module_id: 8, able: '1', will: '1' },
{ module_id: 7, able: '1', will: '1' },
{ module_id: 7, able: '1', will: '1' },
{ module_id: 5, able: '1', will: '1' },
{ module_id: 5, able: '1', will: '1' },
{ module_id: 3, able: '1', will: '1' },
{ module_id: 3, able: '1', will: '1' },
{ module_id: 6, able: '1', will: '1' },
{ module_id: 6, able: '1', will: '1' } ]
然后“有趣”的部分来了:
for(var i = 0; i < obj.length; i++) {
var object = obj[i];
console.log("has object", object);
db.knex('interests').where({
inventory_id: inventory_id,
module_id: object.module_id
}).select().limit(1).then(function (result) {
console.log("MODULE ID", object.module_id);
if (result.length == 0) {
db.knex('interests').insert({
inventory_id: inventory_id,
module_id: object.module_id,
could: object.able,
would: object.will
}).then(function (a) {
});
} else {
db.knex('interests').where({
inventory_id: inventory_id,
module_id: object.module_id
}).update({
could: object.able,
would: object.will
}).then(function (a) {
});
}
});
}
代码的作用如下:
遍历数组
查询数据库
如果没有结果,就创造一些东西
如果有结果,更新一些内容
只有一个问题。for循环太快。或者,换句话说:查询太慢。为什么?因为object.module\u id始终是数组中最后一个module\u id。
如何确保它使用for循环中的模块id,而不是上次迭代时给定的变量?
最佳答案
实际上,不是那个节点太快。这是因为查询是异步工作的。
进程不会等待查询完成以继续循环。当它们被执行时,循环已经结束了。
我建议在函数中用数据作为参数包装所有查询/更新:链接回调方法,以便它们可以按预期工作
var queryinterest = function(object){
db.knex('interests').where({
inventory_id: inventory_id,
module_id: object.module_id
}).select().limit(1).then(function (result) {
if (result.length == 0) {
insertInterest(object)
} else {
updateInterest(object)
})
}
然后在主循环中调用它们。
for(var i = 0; i < obj.length; i++) {
queryInterests(obj[i])
});
}
编辑:这篇文章非常有助于阐明异步工作的原因和方法:
Nodejs asynchronous confusion