2016-08-23 89 views
0

我很新的节点JS和我想明白了一两件事在这里:的Mysql里面插入一个for循环节点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 

然后我运行一个功能转换的详细地址一家经纪公司成长为经合组织,它的运作良好。从那以后,我再次打印机构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

我怀疑这个陌生是因为你在'然后得到了'closure'函数的文档'geocoder.geocode(fulladdress)'的条款。有人能证实这一点吗? –

回答

0

你说得对。 Nodejs是异步和事件驱动的。你应该做的是在每个循环之后实现一个回调。你可能喜欢使用“异步”

Async.js

+1

鼓励与外部资源的链接,但请在链接的周围添加上下文,以便您的同行用户了解它是什么以及它为什么在那里。如果目标网站无法访问或永久离线,请始终引用重要链接中最相关的部分。 – pableiros

+1

“.then(...)'子句中的函数不是他的承诺的回调函数吗? –

+0

@SamuelToh我同意,我一直在使用.then()或.all()作为这种sql查询的回调,现在几个月,工作得很好。 – Roberrrt

0

所以下面BK HIEN的建议和最大约在节点JS繁忙的环路的答案我给一个尝试异步模块,现在同步工作(问题我inicial代码是用于循环永远不会等待它内部的功能将被执行)

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

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