2016-08-23 93 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