[問題] 關於Closure、callback及IIFE的問題

看板Ajax作者 (652公車)時間10年前 (2013/09/01 23:24), 編輯推噓6(6013)
留言19則, 4人參與, 最新討論串1/1
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)

09/01 23:25, , 1F
你完全理解錯誤...
09/01 23:25, 1F

09/01 23:26, , 2F
asyncFunction 的 callback 裡改成 a += response
09/01 23:26, 2F

09/01 23:27, , 3F
另外就是這個response會沒有順序 因為你不能控制非同步
09/01 23:27, 3F

09/01 23:27, , 4F
函數執行的順序
09/01 23:27, 4F

09/01 23:27, , 5F
^完畢
09/01 23:27, 5F

09/01 23:40, , 6F
我一開始就是照樓上的這樣寫,不過L13依舊為空白
09/01 23:40, 6F
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)

09/01 23:50, , 7F
asyncFunction還沒全部跑完阿...加一個 i 當asyncFunction
09/01 23:50, 7F

09/01 23:50, , 8F
呼叫 callback 的時候 i+1 等到 i === arrFoo.length
09/01 23:50, 8F

09/01 23:50, , 9F
再 alert(a)
09/01 23:50, 9F

09/02 01:49, , 10F
如上所說L13執行時沒辦法保證asyncFunction已經執行
09/02 01:49, 10F

09/02 02:00, , 11F

09/02 02:00, , 12F

09/02 02:02, , 13F
處理非同步回呼建議用jquery defer
09/02 02:02, 13F

09/02 02:14, , 14F

09/02 13:10, , 15F
感謝樓上,我晚上再來試看看
09/02 13:10, 15F

09/02 21:55, , 16F
我試過了確實可行,但原本的需求是L11後面還有一大堆要處理
09/02 21:55, 16F

09/02 21:55, , 17F
的事情,現在看起來就是傳一個function到裡面去做了
09/02 21:55, 17F

09/02 21:58, , 18F
如果要這樣寫, 那alert(a)之前最好加一下保護機制
09/02 21:58, 18F

09/02 21:58, , 19F
不然很容易遇到傳入的變數不是預期的格式
09/02 21:58, 19F
文章代碼(AID): #1I8rmqM9 (Ajax)