Ajax 板


LINE

※ 引述《lovelycateye (我還想要更多力量)》之銘言: : ※ 引述《atoi (atoi)》之銘言: : : 假設Universities[j][i]是存放校名,這變數的row是表示某一區 : : 而column表示該區的一些學校,myGeocoder = new GClientGeocoder(); 這行寫過了 : : 以下就是code的部分: 其實要看重點... : : for(var i = 0 ; i < Universities[j].length ; i++ ) ^ : : { : : myGeocoder.getLatLng( Universities[j][i], function(point) ^^^^^^^^^^^^^^^ : : { : : if(!point) : : window.alert(Universities[j][i] + " not found"); ^ : : else : : { : : window.alert(Universities[j][i]); : : } : : } : : ); : : } : : 而這個code跳出來的視窗裡面寫的都是同一個校名,而且都是該區的最後一個 : : 學校,不知道是為什麼,可以請大家幫忙看看嗎,謝謝了 : 1.沒用過google maps api的人,天曉得GClientGeocoder,是什麼東西。 這個問題還不需要知道... : 2.怕的話可以在for迴圈裡面加上 myGeocoder.setCache(null); 不是這問題... : 3.重點來了 : 這是ajax,我沒記錯的話,不可能有辦法預期哪一個geoencode會先完成。 : 換句話說你可能是abc三個學校照順序傳,但是他是完成就call你的function, : 所以有可能是bca的順序叫到。 : 因此你根本不會知道第一個回傳的經緯度是不是真的是你第一個叫他做的地址。 這點沒錯,是需要考慮的問題, but 不是主要問題... : 4.你的i和j在你的callback裡面應該是看不到才對的。 : callback function裡面只看得到point和Universities[]才對。 根據 js 的 var scope , 只要是在同一function closure有定義,是看得到的.... : 當然,我不知道你有沒有把i和j另外存放,不過看起來是沒有。 : 5.最後,這應該要去google版問吧? (雖然回文的我沒資格說就是=3=) 本板歡迎跟 js 有關的問題... : 6.補充:方便的話附上完整code比較容易看出問題在哪,因為這code一看就是有問題。 : 7.不負責任猜測:八成是你有把i和j存起來,然後迴圈跑一次就存一次i和j, : 所以大概你會跳出的都是最後一個學校。 其實這是個經典問題, 因為所有 function 共用 i 這個變數,而且又是非同步的, 所以 i 這個變數因為迴圈執行的太快,getLatLng跑得比較慢, 所以function callback又是在一定時間之後, 所以就導致 i 很有可能已經跑完迴圈,改變成最後一個迴圈值, 這個問題的最基本型態會長這樣 for(var i=0;i<10;++i){ setTimeout(function(){ alert(i); },3000); } 因為setTimeout是非同步的,且3000ms遠超過for需要跑完的時間, 所以最後取得的 i 都會是10. 至於解決方案,一個是作queue,讓他依序進行。 如 var j=0; for(var i=0;i<10;++i){ setTimeout(function(){ alert(j); j++; },3000); } (這是要在確定他的行為是同時、依序回來的前提下,ajax情形不一定適用...) 另一個是by object存放的方式進行. 這裡我是用setTimeout+字串的性質來作一個比較取巧的說明 for(var i=0;i<10;++i){ setTimeout("alert('"+i+"');",3000); } 一般來講比較正常的作法會是在callback 傳入一個專屬的object, 由他去記得原本傳入的值,這也是為什麼大部分的js callback都有提供, 由母函式帶值給子函式的理由。 回到原本的例子,其實以他的需求,我比較建議他用getLocations去拿... 回傳值會是Placemark 帶 adress/point 所以就可以改寫成 Universities=[["元智大學","淡江大學","中正大學","嘉義大學","火星大學"]]; var j=0; for(var i = 0 ; i < Universities[j].length ; i++ ) { geocoder.getLocations( Universities[j][i], function(point) { if(!point.Placemark){ alert(point.name+" not exist"); }else{ alert(point.name+":"+point.Placemark[0].Point.coordinates); } } ); } -- btw 我覺得官方gmap reference寫得還蠻不詳細的。 :p -- 我:一半的日子讓你說,我聽你說你的所有______________________________________ ______________________________________一半的日子我想說,對你說過去的所有:我 _______________________________________________________ 在討論中妥善扮演兼具聆聽與分享的角色,是我們一生的課題。 _______________________________________________________ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.137.196.9
1F:推 atoi:謝謝喔,目前應該OK了 05/24 10:29







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP