台灣最大程式設計社群網站
線上人數
1337
 
會員總數:246038
討論主題:189626
歡迎您免費加入會員
討論區列表 >> ASP.NET >> 呼叫多次google map api 再把值ajax回寫db
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
呼叫多次google map api 再把值ajax回寫db
價值 : 50 QP  點閱數:361 回應數:6
樓主

芋頭
初學者
247 457
3114 457
發送站內信

請問各位大大
我在前端寫了一個function -->會迴圈去呼叫google map API 計算兩點的行駛里程(因為不只一個案件需要計算) ,
每一次計算完成後 , 會呼叫ajax把算完的資料寫入後端 , 所以假設有50筆要算里程 , 就會ajax呼叫50次 ,
測試google跑了50次 , 但是ajax後端該處理的卻只有10次 ,
請問這個需要怎麼解決?
謝謝~~

搜尋相關Tags的文章: [ google map api ] , [ ajax ] ,
本篇文章發表於2019-10-02 17:58
1樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
測試google跑了50次 , 但是ajax後端該處理的卻只有10次


這應該是Google API的限制
每秒最多10次的要求

您可以修改您的程式,每10次後,休息1秒,然後再下個10次
這樣試試看

詳細請參考Google API的說明

https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas
本篇文章回覆於2019-10-03 09:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

芋頭
檢舉此回應
原來如此 學習了
另外再請教 呼叫GOOGLE API試非同步的方式 , 能否改設為同步的方式呢??
謝謝
本篇文章回覆於2019-10-04 17:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

芋頭
檢舉此回應
程式碼如下 請問要如何調整
謝謝~~
我測試程式的順序會是 156234 ,但是我想要的是123456阿 ><
function beg() {
{
var i = 0;
var Arr1 = new Array();
var Arr2 = new Array();
var Arr3 = new Array();

Arr1 = $("#txt1").val().split(',');
Arr2 = $("#txt2").val().split(',');
Arr3 = $("#txt3").val().split(',');

var ret = setInterval(function () {
if (Arr1[i].toString() != "" && Arr1[i].toString().length==10)
{
var request = {
origin: Arr2[i],
destination: Arr3[i],
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
//宣告

var dist = 0;
var status ="";
var strTmp = "";

var directionsService = new google.maps.DirectionsService();
console.log("1");
directionsService.route(request, function (response, status)
{
console.log("2");
if (status == google.maps.DirectionsStatus.OK)
{
var route = response.routes[0];
for (var j = 0; j < route.legs.length; j++)
{
var routeSegment = j + 1;
strTmp += route.legs[j].distance.text;
}
//取得距離(公里)
dist = 0;
dist = parseFloat(parseFloat(strTmp)).toString();
}
console.log("3");
$.ajax(
{
.............................. }
);
console.log("4");
})

console.log("5");
i++;
console.log("6");
}
else
{
clearInterval(ret);
}
}, 1000);

}

}
本篇文章回覆於2019-10-04 18:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
Ajax屬於『非同步』
他是同時有好幾條線,『同時』對Server發出要求
哪個先得到回來,應該都不一定
(每次的順序可能都不同)

如果您非要以123456的順序
則要考慮使用『同步』的方式,也就是『循序執行』的方式
一個做完,取得結果,在執行下一個
速度上會有差,您再思考看看

本篇文章回覆於2019-10-07 09:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

topcat
捐贈 VP 給 topcat 檢舉此回應
好奇問一下
為何非要123456的順序?
有什麼特別的需求非要這樣的順序嗎?

在還不知道您的需求前,假設,是為了呈現資料的順序
如果要求的時候,傳個序號過去,回傳的時候也可以取得傳過去的序號
在呈現的時候,自己在從資料庫取資料時進行序號的排序,這樣是否會更符合需求?

^.^a
本篇文章回覆於2019-10-07 09:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

芋頭
檢舉此回應
請問各位高手 .我這樣的架構會有問題嗎?(因為都是非同步,怕會更新錯亂)
1.先一次把所有要計算行駛距離的資料依次抓回來(假設1000筆)
2.迴圈呼叫function(Distance)去google取得距離
3.取得距離後再利用Datakey對應把資料ajax回寫後端table
謝謝指導
$(function () {
GetProcessData();
});
function GetProcessData() {
//先ajax去後端把所有要計算行駛距離的資料依次抓回來
$.ajax({
type: "POST", //POST方法
contentType: "application/json; charset=utf-8",
url: "test.asmx/GetProcessData",
async: false,
dataType: "json",
data: "",
success: function(data) { //完成時
var jsonObject = jQuery.parseJSON(data.d);
//把每一筆資料一個一個傳入Distance去google取得行駛距離
for (i = 0; i < jsonObject.length; i++) {
setTimeout(function() {
Distance(Datakey,start,end)//傳入開始的地址跟結束的地址
}, 3000);
}
},
error: function() { alert("error"); } //錯誤時
});
}
function Distance(Datakey,start,end) {
var request = {
origin: start,
destination: end,
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
//宣告
var directionsService = new google.maps.DirectionsService();
...
directionsService.route(request, function (response, status) {
....
if (status == google.maps.DirectionsStatus.OK) {
........
//取得距離(正整數,公尺)後再ajax 把距離回寫後端TABLE
var dist = parseInt(parseFloat(strTmp) * 1000).toString();

$.ajax({
type: "POST", //POST方法
contentType: "application/json; charset=utf-8",
url: "test.asmx/InsertData",
async: false,
dataType: "json",
data: "{mykey:'" + Datakey + "',mDistance:'" + dist + "'}",
success: function(data) { //完成時
...
}
},
error: function() { alert("error"); } //錯誤時
}

});
}
本篇文章回覆於2020-09-16 10:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.