Mysql插入节点js中的for循环内

时间:2016-08-23 01:49:30

标签: node.js

我是Node js的新手,我想在这里理解一件事:

正如您所看到的,有一个for循环从数据库选择中迭代一行。

connection.query(/*select data*/)
for (var i = 0; i < rows.length; i++) {
    var fulladdress = rows[i]['agency_full_address'];
    var agency = rows[i]['agency_id'];
    console.log('before:' + agency)
        geocoder.geocode(fulladdress)
            .then(function(res) {
                console.log('after:' + agency)
                /*populate table with agency and coordenates*/
            })

            .catch(function(err) {
                console.log(err)
            });
}

我在循环之后做的第一件事就是获取完整的地址和代理商ID并记录下面的结果:

before: 1
before: 2
before: 3

然后我运行一个函数将一个代理商的完整地址转换为lat和long coordenates,它运行正常。之后,我再次打印代理商ID,然后我有下一个结果

after: 3
after: 3
after: 3

它只打印最后一个ID。我想这是因为nodejs是异步的。但是在这种情况下如何解决这个问题呢。我需要之前和之后的代理ID相同,所以我可以使用这些值来填充数据库中的表,但此时正在填充这样的

agency_id |  latitude  |  longitude  |
    3     | 63.254587  |  -39.221144 |
    3     | 58.256254  |  -48.656989 |
    3     | 48.256254  |  -58.356979 |

应该是这样的

agency_id |  latitude  |  longitude  |
    1     | 63.254587  |  -39.221144 |
    2     | 58.256254  |  -48.656989 |
    3     | 48.256254  |  -58.356979 |

2 个答案:

答案 0 :(得分:0)

你是对的。 Nodejs是异步和事件驱动的。你应该做的是在每个循环后实现一个回调。您可能希望使用&#34; async&#34;

Async.js

答案 1 :(得分:0)

所以按照BK Hien的建议和节点js中忙碌循环的大部分答案,我尝试了异步模块,它现在同步工作(我的inicial代码的问题是for循环从不等待里面的函数它的执行情况)

首先你需要安装异步模块:

npm install async --save

并要求模块:

var async =require('async');

这是最终的代码:

connection.query(/*select data*/)

async.forEachOf(rows, function(value, key, callback) {

            geocoder.geocode(value['agency_full_address'], function(err, res){
                if(err) return callback(err);
                try{
                connection.query('INSERT INTO coordenates SET coordenate_agency_id = ?, coordenate_latitude = ?, coordenate_longitude = ?', [value['agency_id'], res[0].latitude, res[0].longitude], function (error) {
                    if (error) {
                        console.log(error.message);
                    } else {
                        console.log('success');
                    }
                });}catch (e){
                    return callback(err);
                } callback();
            })
        })

您可以查看http://caolan.github.io/async/docs.html

中的文档