Ajax 板


LINE

前陣子因為試用 Visual Studio Code 與 Electron 寫了一個小專案 剛好寫到跟你問題一模一樣的東西,code 在此 https://github.com/s25g5d4/SlideShow/blob/master/scripts/main.js#L76 我使用 mrbigmouth 板友提到的 async.js 套件,你可以參考一下 configs.images 是一個包含數個字串的陣列 (就是圖檔檔名) loadImg 函數會試著把這些圖檔載入,具體行為是 1. 建立 Image() 並檢查是否有 cache (透過檢查 complete 屬性) 2. 掛上 onload 事件 3. 掛上 onerror 事件 imgDone 函數是當 configs.images 裡所有圖檔都載入後 過濾錯誤的圖片,將頁面初始化並開始繪製畫面 -- 若不引入 async.js 套件,可以參考 dianwu 板友的解法 只是不需要多 imgReady 變數 直接檢查 array.length 跟 m.length 就好 另外一個做法是把 dosomething() 改寫成 function dosomething(val, array) { array.push(val); // 如果圖檔還沒全部載入,就先退出 function if (array.length < m.length) return; // 若執行到這邊代表圖檔已全部載入 // 接著做原本該做的事 // ... } 原本 onload 事件改成 img.onload = function () { //圖片讀取好後進行一些處理再return回來 var t = doImg(this); i.forEach(function(p){ //將圖片及資訊push進array dosomething({ img : t, p1 : p, p2 : [p[0] + t.width, p[1] + t.height], p3 : t.pos[1] + p[1] }, array); }); }; -- 另外 dianwu 板友提到「不建議在迴圈中直接宣告 function」 我的看法是「不建議使用匿名函數」 這並不是代表不要使用 callback 或 Immediately-invoked function expression 註:即 (function () { /* some code */ }()) 而是使用 function expression (以下簡稱 func expr) 時一定要指定函數名稱 在偵錯的時候瀏覽器開發工具或 Node.js 大多會提供 function call stack 如果用一堆匿名函數,錯誤訊息會看得很痛苦 http://craigshoemaker.net/images/command-prompt-node-error.png
有看到 at <anonymous>:1:55 嗎? 如果 func expr 在內部須呼叫 func expr 本身 使用具名函數便可以以該名稱存取自己 範例: setTimeout(function doAnimation() { // do something setTimeout(doAnimation, 100); }, 100); 而且不會造成任何變數汙染問題 doAnimation 名稱只在 doAnimation 函數內可見 即使在與 setTimeout 同 scope 的地方也不可見 doAnimation 所以不用擔心會蓋掉同樣名稱的變數 -- 其實我不知道為什麼 scope 會有問題 除非把 function 提到迴圈所在 scope 外面才會造成 scope 不同 以下兩個例子的 scope 是一樣的 ======== array.forEach(function forEach(e, i) { // do something }); ======== var doSomething = function doSomething(e, i) { // do something }; array.forEach(doSomething); ======= 在大多數情況下, callback function 應該不需要離 iteration 太遠 頂多拉出來變成另一個變數,這樣還是會在同一個 scope 下啊 XD 如果有必要讓 callback 與 iteration 所在 scope 不同 那應該是這個 callback 可以在多個地方重複使用 這種情況下就需要注意 scope 的問題 javascript 是 static(lexical) scope 的語言 scope 只與 function 定義的地方有關,與執行期 call stack 無關 --
1F:→ HornyDragon: 昨天看到就秒下載了07/27 22:36
2F:推 jupto: 好色龍也喜歡人味重的了? 我還以為擬人度高的都不行呢07/27 22:40
3F:→ ykes60513: 你誤會了 好色龍看上的是那狼人07/27 22:42
4F:推 HornyDragon: 你看三樓就很懂07/27 22:43
--



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.174.152.40
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Ajax/M.1440214075.A.C46.html
5F:推 dianwu: 詳細的解說,我印象中如果在迴圈內的function 直接使用上 08/22 12:31
6F:→ dianwu: 層的變數很可能在執行時與一開始的想法有出入,特別又是im 08/22 12:31
7F:→ dianwu: g onload,但早上回文時沒有再實做確認一次,也許錯了:) 08/22 12:31
你說的其實不是 scope 問題 是因為 async call 的關係,抓到的是被覆蓋掉的值 解決方法是建立一個新的 scope, 也就是 closure var i; for (i = 0; i < 5; ++i) { setTimeout(function () { alert(i); }, 1); } 這個範例會彈出五個 5, 而不是預期的 0, 1, 2, 3, 4 var i; for (i = 0; i < 5; ++i) { (function (t) { setTimeout(function () { alert(t); }, 1); }(i)); } 這樣才是預期的 0, 1, 2, 3, 4 -- 酷一點的解法 var i; for (i = 0; i < 5; ++i) { setTimeout(alert.bind(this, i), 1); } -- 這應該是講到爛掉的問題了 :P ※ 編輯: s25g5d4 (1.174.152.40), 08/22/2015 13:13:05
8F:推 m2251000: 謝謝大大詳細講解!檢查快取那一步讓我學到了新東西! 08/22 23:18







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燈, 水草

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

TOP