我对包含查询的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

07-26 04:48