我是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 |
答案 0 :(得分:0)
你是对的。 Nodejs是异步和事件驱动的。你应该做的是在每个循环后实现一个回调。您可能希望使用&#34; async&#34;
答案 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();
})
})
中的文档