2016-07-26 68 views
1

這個問題不同於以前發佈在異步進程上的問題。我正在開發一個類似於應用程序的超級應用程序,並且我正在使用Firebase作爲後端。我製作了一個服務器來處理一些任務,比如給駕駛員分配命令。當出現訂單時,我需要使用Google地圖API找到所有司機和客戶之間的距離。以下是我用來計算駕駛員和客戶之間距離的功能。以同步方式執行異步進程Node.js |谷歌地圖

function calculatingDistance(fromLat,fromLong,toLat,toLong){ 
    var distanceDurationObject={}; 
var options = { 
    host: 'maps.googleapis.com', 
    path: '/maps/api/directions/json?origin='+fromLat+','+fromLong+'&destination='+toLat+','+toLong+'&key=AIzaSyBsoc1PZOItqHNYc5z2hW_ejPFi2piRR8Y', 
    method: 'GET', 
    headers: { 
     'Content-Type': 'application/json' 
    } 
}; 

var req = https.get(options, function(res) { 
//buffering alll data 
    var bodyChunks = []; 
    res.on('data', function(chunk) { 
    // You can process streamed parts here... 
    bodyChunks.push(chunk); 
    }).on('end', function() { 
    var body = Buffer.concat(bodyChunks); 
    json = JSON.parse(body); 
    //parsing json returned 
    var routes =json["routes"]; 
    var legsObject=routes[0].legs; 
    var legsFirstArray=legsObject[0]; 
    //Our Required Distance between two points 
    var distanceValue=legsFirstArray.distance.value; 
    var durationValue=legsFirstArray.duration.value; 
    console.log(distanceValue+" "+durationValue); 
    distanceDurationObject.distance=distanceValue; 
    distanceDurationObject.duration=durationValue; 

    }); 
}); 

req.on('error', function(e) { 
    console.log('ERROR: ' + e.message); 
    //try to add this error to a file 
}); 
} 

發現客戶和出租車司機之間的距離的流量給出了波紋管。

1)一旦訂單出現在數據庫中,它將被提取到服務器中並保存在一個包含key的地圖中,作爲customer和value的id作爲提供客戶經度和緯度的對象。

2)還有一個地圖,其中包含作爲驅動程序ID和值的關鍵字作爲包含驅動程序緯度和經度的對象。

3)使用上面給出的函數計算與所有駕駛員的客戶距離,並且具有最小距離的一個駕駛員接收到通知。

問題:

我想是,一旦出現的次序,在for循環中我添加「calculatingDistance(fromLat,fromLong,toLat,toLong)」功能與toLat和toLong具有緯度和經度隊列的司機以及來自拉特和龍的客戶的經緯度。在for循環之後,我執行所有的回調函數,一旦所有的回調函數完成,函數x()被調用,所有回調函數的距離durationObject返回函數x();

TL; DR基本上我只是希望所有異步函數的數據在完成執行後都集成到一個函數中。

+0

看到這個答案:http://stackoverflow.com/questions/38426745/how-do-i-return-the-accumulated-results-of-multiple-parallel-asynchronous-func/38427271#38427271 – slebetman

+0

你的選擇是使用Promise和'Promise.all()',使用異步庫或者編寫一個簡單的計數器,並在所有的異步任務完成之後進行計數,然後調用你的函數。您不會將異步代碼轉換爲同步代碼 - 這在JavaScript中不會發生。您將跟蹤所有異步操作何時完成,收集結果,然後用最終結果/錯誤調用某個回調。這裏有數百個其他相關的問題。 – jfriend00

回答

1

您正在尋找Promise.all

+1

非常感謝! Promise.all解決了我的問題。 –

1

你可以使用async庫來實現你所需要的。該庫具有廣泛的同步任務功能。例如async.waterfallasync.series可以在這裏完成這項工作。 您可以在回調函數中使用它們以實現同步行爲。