Ajax 板


LINE

本篇可以參考: http://ithelp.ithome.com.tw/question/10090792 ----------------------------------- ----------------------------------- 所謂的 queue ,主要是把多個「非同步」的 task 「依序」做完。 (不是說同步不行,只是同步的話, 不需要靠 queue 就會依序做完,不需要特別做 queue 。) 在 jQuery 狀況下,queue 主要是拿來作 animation 效果內部實作, 反而不多人會在正式開發用它,一方面是他難懂, 另一方面是使用者還不知道什麼時候該用 queue。 舉個例子,以 fadeIn 來講, 他是將物件顯示為顯示,並設 opacity 從 0 到 100。 如果我要自己刻一個簡易實作,直覺你可能想到要這樣作。 http://jsfiddle.net/eqAdS/ [code] <div id="target" style="width:150px;height:150px;background:red;"> Test </div> <script> var item = $("#target"); item.show(); item.css("opacity",0); for(var i = 0 ; i < 100 ;++ i){ item.css("opacity", i / 100 ); } item.html("fadeIn invoked"); </script> [/code] 但是你會發現看不見效果。 因為 animation 需要有間隔時間,看起來才像 animation, 不然直接從 0 跑個迴圈到100 ,時間太短會看不到畫面呈現。 那我們下一版改為這樣的實作 http://jsfiddle.net/eqAdS/1/ [code] <div id="target" style="width:150px;height:150px;background:red;"> Test </div> <script> var item = $("#target") , time = 500; item.show(); item.css("opacity",0); for(var i = 0 ; i <= 100 ; i +=10){ //use ind to protect variable "i",or it will always be 100 (function(ind){ //put all the process into queue $("#target").queue("fadeIn",function(){ item.css("opacity", ind/100 ); setTimeout(function(){ //run next item $("#target").dequeue("fadeIn"); },time); //every 500 ms }); })(i); } $("#target").dequeue("fadeIn"); //start to run items! item.html("fadeIn invoked"); </script> [/code] 你會發現這次看起來像樣多了,他的原理是假設你有十件事情要做, 你可以先用 $(selector).queue(name,function) 推入指定的 queue , 但是因為我們知道處理流程通常都是非同步的 (timeout / ajax ...etc ), 那系統怎麼會知道什麼時後要執行下一個呢? 答案是:它就是不知道。 所以你必須要自己告訴他,當你呼叫 $(selector).dequeue(name) 表示說, 我要開始了或我這一輪作完了,作下一輪吧! 比方說偶爾會有個需求是,我希望先做完 ajax1 , 確定他做完了再作 ajax2 ,那就會像是以下的 code [code] //建立第一個排程,此時還沒執行 $("#target").queue("myqueue",function(){ //do something , like ajax $.post("myurl.php",function(){ //run next queue item after ajax success $("#target").dequeue("myqueue"); }); }); //建立第二個排程,此時還沒執行 $("#target").queue("myqueue",function(){ //do something , like ajax $.post("myurl2.php",function(){ //run next queue item after ajax success $("#target").dequeue("myqueue"); }); }); $("#target").dequeue("myqueue");//開始執行 //此時它會開始先跑 myurl.php 的 ajax ,確定 success 有收到回應後, //再跑 myurl2.php 的ajax。 [/code] 當然他還有一些延伸用法,但這裡基於教學立場, 我們就只提到最基本該有的東西: 另外,如果因為某些因素你想清空正在執行的 queue , 像是jQuery animation 的 stop() , 你可以 call $(selector).clearQueue("myqueue"); 附帶一提,jQuery 1.4 以後提供更方便的操作方式, 原本寫成 [code] $("#target").queue("myqueue",function(){ //do something , like ajax $.post("myurl.php",function(){ //run next queue item after ajax success $("#target").dequeue("myqueue"); }); }); [/code] 可以改寫成 [code] $("#target").queue("myqueue",function(next){ //內建傳入 next 方便作dequeue //do something , like ajax $.post("myurl.php",function(){ //run next queue item after ajax success next(); //用傳進來的 next function 取代 dequeue() }); }); [/code] 所以我們最一開始的 myFadeIn 開發範例就可以變成這樣, 寫起來可以省下不少力氣。 http://jsfiddle.net/eqAdS/2/ [code] <div id="target" style="width:150px;height:150px;background:red;"> Test </div> <script> var item = $("#target") , time = 500; item.show(); item.css("opacity",0); for(var i = 0 ; i <= 100 ; i +=10){ //use ind to protect variable "i",or it will always be 100 (function(ind){ //put all the process into queue $("#target").queue("fadeIn",function(next){ item.css("opacity", ind/100 ); setTimeout(next,time); //every 500 ms }); })(i); } $("#target").dequeue("fadeIn"); //start to run items! item.html("fadeIn invoked"); </script> [/code] 最後討論 Queue 的主要適用情境: 1.大量同時運算導致網頁卡住時,用來作為運算的分流用。 2.操作有相依性,需要等待時 (需確定 A 操作完的結果、狀態才能操作B ...etc ) 3.animation -- Life's a struggle but beautiful. --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.56.138 ※ 編輯: TonyQ 來自: 114.25.56.138 (04/16 00:58)
1F:推 nightspirit:ajax如果要做queue的話,可以直接用deferred 04/18 01:08
2F:推 davidsky:deferred好用+1 04/21 04:01
3F:推 epenpal:大推、對我非常有用 05/04 16:47
4F:推 jimpop:淚推這篇~~太讚了!! 06/22 16:31







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

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

TOP