2016-08-23 4 views
0

私はノードのjsに非常に新しいですし、私はここに一つのことを理解しようとしています:あなたが見ることができるようMySQLは、ループのための内側に挿入するノードの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が非同期であるためだと思います。この場合、どうすればこの問題を解決できますか?私はこの

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 | 
ようにする必要がありますように移入されているので、私は、データベース内のテーブルを埋めるために、これらの値を使用する前と後の代理店IDが同じである必要があるが、この瞬間に
+0

のドキュメントを確認することができます

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(); }) }) 

'geocoder.geocode(fulladdress)'の '節です。誰かがこれを確認できますか? –

答えて

0

あなたはそうです。 Nodejsは非同期でイベント駆動型です。あなたがすべきことは、各ループの後にコールバックを実装することです。あなたは「非同期」

Async.jsを使用するようなことがあり

+1

外部リソースへのリンクが推奨されていますが、リンクの周りにコンテキストを追加して、仲間のユーザーがそれが何であるか、その理由を理解できるようにしてください。ターゲットサイトに到達できない場合や、永続的にオフラインになる場合は、常に重要なリンクの最も関連性の高い部分を引用してください。 – pableiros

+1

'.then(...)'節の関数が彼の約束のコールバックではありませんか? –

+0

@SamuelToh私は同意します。私はこの種のSQLクエリーのコールバックとして.then()または.all()を数ヶ月使用しています。 – Roberrrt

0

だから、BKヒエンのアドバイスと私は非同期モジュールへの試みを与え、それが今で同期動作するノードのjsで忙しいループについての回答のほとんど(問題以下

npm install async --save 

やモジュールが必要になります:私のinicialコードだったとループのために実行されることの内部機能)

は、まず最初にやる非同期モジュールをインストールする必要があるのを待つことはありません

var async =require('async'); 

、これが最終的なコードの作業です:あなたは、私はこの奇妙あなたは `、その後に入った` closure`機能によるものである疑いがあるhttp://caolan.github.io/async/docs.html

関連する問題