看板 Ajax 關於我們 聯絡資訊
01 var a = ""; 02 03 arrFoo.forEach(function(bar){ 04 var res = (function(){ 05 asyncFunction(function(response){ 06 return response; 07 }); 08 })(); 09 10 a += response; 11 }); 12 13 alert(a); 今天一整天都在研究Closure跟IIFE之間的關係,結果還是沒有成功。 以上述的code為例,我想要把asyncFunction回傳的res全部都併在a裡面, 可是無論我有沒有加L4跟L8,最後在L13的alert卻仍然為空白(就是L1的預設值"") 請問有朋友知道這該如何處理嗎?(明天到公司繼續啃相關文件) -- 雜七雜八的kewang部落格 http://kewang.tw -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.134.3.53 ※ 編輯: kewang 來自: 220.134.3.53 (09/01 23:24)
s25g5d4:你完全理解錯誤... 09/01 23:25
s25g5d4:asyncFunction 的 callback 裡改成 a += response 09/01 23:26
s25g5d4:另外就是這個response會沒有順序 因為你不能控制非同步 09/01 23:27
s25g5d4:函數執行的順序 09/01 23:27
s25g5d4: ^完畢 09/01 23:27
kewang:我一開始就是照樓上的這樣寫,不過L13依舊為空白 09/01 23:40
01 var a = ""; 02 03 arrFoo.forEach(function(bar){ 04 (function(){ 05 asyncFunction(function(response){ 06 a += response; 07 }); 08 })(); 09 }); 10 11 alert(a); 一開始的寫法是這個樣子,結果L11一樣是顯示為空白 Orz ※ 編輯: kewang 來自: 220.134.3.53 (09/01 23:49)
s25g5d4:asyncFunction還沒全部跑完阿...加一個 i 當asyncFunction 09/01 23:50
s25g5d4:呼叫 callback 的時候 i+1 等到 i === arrFoo.length 09/01 23:50
s25g5d4:再 alert(a) 09/01 23:50
davidsky:如上所說L13執行時沒辦法保證asyncFunction已經執行 09/02 01:49
davidsky:http://jsfiddle.net/T5QJ5/ 09/02 02:00
davidsky:http://jsfiddle.net/T5QJ5/1/ 09/02 02:00
davidsky:處理非同步回呼建議用jquery defer 09/02 02:02
davidsky:http://jsfiddle.net/T5QJ5/2/ 09/02 02:14
kewang:感謝樓上,我晚上再來試看看 09/02 13:10
kewang:我試過了確實可行,但原本的需求是L11後面還有一大堆要處理 09/02 21:55
kewang:的事情,現在看起來就是傳一個function到裡面去做了 09/02 21:55
StephenCurry:如果要這樣寫, 那alert(a)之前最好加一下保護機制 09/02 21:58
StephenCurry:不然很容易遇到傳入的變數不是預期的格式 09/02 21:58